2011-08-24 119 views
5

我试图获得舒适与JTable中,TableModels,JTableHeaders,渲染等我试图做一个简单的虚拟表(实践的目的),看起来像这样:更改秋千JTable中单元格的颜色

- 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似乎是奇怪,美丽和强大的野兽。我正在慢慢地围绕他们思考,但是却在执行上感到窒息。感谢任何可以帮助!

+0

仍在等待SSCCE ... – camickr

+0

另请参阅此[相关示例](http://stackoverflow.com/a/12352838/230513)。 – trashgod

回答

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你的问题。

3

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

而要查看您的表格标题,您应该先将表格添加到JScrollPane,然后将JScrollPane添加到父级。

最重要的是:阅读JTable上的Swing教程,因为这里全部解释了这些。

+0

感谢气垫船 - 请参考Renderer类中添加的条件。它仍然没有工作 - 我错过了什么? – IAmYourFaja

4

半答案:

你需要把你的JTableJScrollPane有显示的标题。或者,您也可以手动将由myTable.getTableHeader()返回的组件添加到布局中。不过我推荐使用JScrollPane

编辑:

如下建议,把背景蓝色的只是一个特定的细胞,你需要做的就是添加一个测试像这样的:

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

并且:如果在'myTable.setDefaultRenderer(Object.class,myRenderer);'用'String.class'替换Object.class'会发生什么? – ChrisJ

+0

这会如何帮助他解决问题? –

+0

我表格中的所有数据都是字符串。我是否需要将该调用更改为使用String.class,如果是这样,那会破坏什么?我需要改变什么才能解决这个问题呢? – IAmYourFaja

0

也许,myTable.setDefaultRenderer(String.class, myRenderer);将工作正确。

0

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