簡體   English   中英

更改 Swing JTable 單元格顏色

[英]Changing Swing JTable Cell Colors

我正在嘗試適應 JTables、TableModels、JTableHeaders、渲染器等。我正在嘗試制作一個簡單的虛擬表(用於練習目的),如下所示:

-    1    2   3
A    A1   A2  A3
B    B1   B2  B3
C    C1   C2  C3

我還希望 B2 單元格 - 只有那個單元格 - 具有藍色 (Color.BLUE) 背景 - 所有其他單元格都可以具有自動分配的 Swing 默認顏色。

我的代碼如下,基於我在本網站和整個互聯網上找到的無數示例。 但我沒有得到我想要的結果。 相反,我得到了一個看起來像這樣的表:

A    A1   A2  A3
B    B1   B2  B3
C    C1   C2  C3

請注意,第一行(標題)根本不存在。 此外,使用我在下面列出的代碼,這將執行並設置所有着色單元格的顏色,而不僅僅是我想要的 B2 單元格。

代碼

public class MyTable
{
    public static void main(String[] args)
    {
        String[][] data = getTableData();
        String[] cols = getTableCols();

        JFrame frame = magicallyCreateJFrame();     // I promise this works!
        MyRenderer myRenderer = new MyRenderer();   // See below

        DefaultTableModel defModel = new DefaultTableModel(data, cols);
        JTable myTable = new JTable(defModel);

        myTable.setDefaultRenderer(Object.class, myRenderer);

        frame.add(myTable);
        frame.pack();
        frame.setVisible(true);            
    }
}

public static String[] getTableCols()
{
    String cols =
    {
        "-",
        "1",
        "2",
        "3",
    };
}

public static String[][] getTableData()
{
    String[][] data =
    {
        {
            "A",
            "A1",
            "A2",
            "A3",
        },
        {
            "B",
            "B1",
            "B2",
            "B3",
        },
        {
            "C",
            "C1",
            "C2",
            "C3",
        },
    };

    return data;
}

以及快速骯臟的MyRenderer類:

public class MyRenderer extends DefaultTableCellRenderer  
{ 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean   isSelected, boolean hasFocus, int row, int column) 
{ 
    Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

    if(row == 2 && column == 2)
        c.setBackground(new java.awt.Color(0, 0, 255)); 

    return c; 
} 

} 

除了這是可怕的代碼並且破壞了許多“最佳實踐”類型的模式和技術(記住這只是我正在玩的東西)這一事實之外,我在這里做的有什么明顯明顯的嗎? 為什么我沒有得到表頭(第一行“- 1 2 3”)? 為什么我的默認單元格渲染器不能在我指定的特定 B2 單元格上工作?

JTables 似乎是奇怪、美麗和強大的野獸。 我正在慢慢地思考它們,但對實施感到窒息。 感謝任何可以提供幫助的人!

您需要確保將渲染器重置為其默認背景顏色(並處理行選擇):

if (! table.isRowSelected(row))
{
    if(row == 2 && column == 2)
        c.setBackground(new java.awt.Color(0, 0, 255));
    else
        c.setBackground(table.getBackground());
}

在未來發布一個適當的SSCCE與您的問題。

半答案:

您需要將JTable放在JScrollPane才能顯示標題。 或者,您可以手動將myTable.getTableHeader()返回的組件添加到布局中。 不過我建議使用JScrollPane

編輯:

如下所示,要將特定單元格的背景變成藍色,您需要做的就是添加一個這樣的測試:

if(column == 2 && row == 1) {
    c.setBackground(Color.BLUE); 
} else {
    c.setBackground(Color.WHITE);
}

您在哪里指定渲染器為 B2 和僅 B2 着色? 也許您想在 getTableCellRendererComponent 方法中放置一個 if 塊,以便僅當 JTable 的值對象的 toString() 為“B2”或行和列值對應於 B2 單元格時,背景顏色才設置為藍色。

要查看您的表頭,您應該首先將表添加到 JScrollPane,然后將 JScrollPane 添加到父級。

最重要的是:閱讀有關 JTables 的 Swing 教程,因為所有內容都在那里進行了解釋。

我相信進行表格着色的正確方法是通過ColorHighlighter 在這里舉了一個例子

也許, myTable.setDefaultRenderer(String.class, myRenderer); 會正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM