2012-07-27 95 views
2

我已经创建了一个自定义单元格渲染器类来实现此目的。更改JTable中某些行的颜色但不是全部

public class MatchTableCellRenderer extends DefaultTableCellRenderer{ 


    public Component getTableCellRendererComponent (JTable table, 
                Object obj, boolean isSelected, boolean hasFocus, int row, int column) { 
     Component cell; 
     cell = super.getTableCellRendererComponent(
       table, obj, isSelected, hasFocus, row, column); 
     if(((String[]) ((MatchTableModel) table.getModel()).getRow(row)).length==7){ 
      System.out.println(((String[]) ((MatchTableModel) table.getModel()).getRow(row))[0]+" "+((String[]) ((MatchTableModel) table.getModel()).getRow(row))[6]); 

      cell.setForeground(Color.green); 

     } 
     return cell; 
    } 


} 

我也在此渲染到我的表中的列使用:

tempColumn = table.getColumnModel().getColumn(0); 
    tempColumn.setCellEditor(new MacColumnEditor()); 
    tempColumn.setCellRenderer(new MatchTableCellRenderer()); 

    tempColumn = table.getColumnModel().getColumn(1); 
    tempColumn.setCellEditor(new IpColumnEditor()); 
    tempColumn.setCellRenderer(new MatchTableCellRenderer()); 

    tempColumn = table.getColumnModel().getColumn(2); 
    DefaultCellEditor dfEditor=new DefaultCellEditor(new JTextField()); 
    dfEditor.setClickCountToStart(2); 
    tempColumn.setCellEditor(dfEditor); 
    tempColumn.setCellRenderer(new MatchTableCellRenderer()); 

我想它含有的String []长度= 7绿色行和其他有默认的颜色。但有趣的是,我所有的行都变成了绿色。你可以看到我有一条打印线。它被打印4次(我的桌子有12行),但所有的行都是绿色的,而不是4个。我做错了什么?

回答

3

原因是臭名昭著的色彩记忆DefaultTableCellEditor的(TM):你必须设置颜色总是,而不是只在一个分支。

if (myCondition) { 
    setBackground(...) { 
} else { 
    setBackground(...) 
} 

的具体细节在recent thread

+0

你给我的线程帮了很多。谢谢。现在我还有一个问题。在表格排序后,我需要突出显示才能正常工作:/ – Alptugay 2012-07-27 11:02:28

+2

convertRowIndexToModel(row) – kleopatra 2012-07-27 11:13:42

3

您可以使用XxxCellRenderer,但更好,最简单的就是使用prepareRenderer()

为正确的代码,你必须内部覆盖或测试的if-else如下patameters

  • isSelected

  • hasFocus

  • column

answers

越来越question约similair问题

+0

+1解释为'prepareRenderer' – MadProgrammer 2012-07-27 08:52:03

+0

@MadProgrammer prepareRenderer这样是不是一个好主意,除非A)的亮点应该适用于一个完整的行b)设计良好的(有偏见的,可重复使用的)可插拔机制来完全控制组件的装/什么/如何装饰 - 作为fi在SwingX :-)基本规则是没有子类的任何JSomething的应用程序的原因 – kleopatra 2012-07-27 10:29:38

+0

+1感谢您的答案。 prepareRenderer()帮助了我,但我达到了我想要的回答@kleopatra – Alptugay 2012-07-27 11:01:25