更改Swing JTable单元格颜色

时间:2011-08-24 20:15:16

标签: java swing jtable

我正在尝试使用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单元格?

JTable似乎是奇怪,美丽和强大的野兽。我正在慢慢地将我的思绪包裹在他们周围,但我对实施感到窒息。感谢任何有帮助的人!

5 个答案:

答案 0 :(得分:14)

您需要确保将渲染器重置为其默认背景颜色(并处理行选择):

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

将来发布适当的问题SSCCE

答案 1 :(得分:4)

半答案:

您需要将JTable放在JScrollPane内以显示标题。或者,您也可以手动将myTable.getTableHeader()返回的组件添加到布局中。我建议使用JScrollPane

修改

如下所示,要将背景蓝色仅转换为一个特定单元格,您需要做的就是添加如下测试:

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

答案 2 :(得分:3)

您在哪里指定渲染器为B2颜色而B2?也许你想在getTableCellRendererComponent方法中放置一个if块,这样只有当JTable的值对象的toString()为“B2”或者行和列值对应于B2单元格时,背景颜色才会设置为蓝色。

要查看表头,首先应将表添加到JScrollPane,然后将JScrollPane添加到父表。

最重要的是:阅读有关JTables的Swing教程,因为这里都有解释。

答案 3 :(得分:0)

也许,myTable.setDefaultRenderer(String.class, myRenderer);可以正常工作。

答案 4 :(得分:0)

我相信表格着色的正确方法是通过ColorHighlighter。我给了example here