2011-10-16 89 views
1

我们正在使用显示数据以及状态(新建,处理,关闭)的JTable。每个状态行都有不同的颜色,这是通过重载JTable的prepareRenderer()来实现的。在排序行后更改Swing JTable中的行颜色

现在我们需要对该表进行排序,并使用table.setAutoCreateRowSorter(true);实现这一目标。行得到正确排序,但行的颜色保持不变。我们需要根据状态列将颜色重新应用于此操作后的所有行。

我在想什么可能是实现这一目标的最佳方法。有几种方法可以考虑:

  1. 重新绘制/重新验证表格。但是,只是做这件事,我认为是行不通的。
  2. 捕获的mouseClicked事件和人工识别是否被单击列标题,然后调用prepareRenderer(),然后调用重绘/重新确认
  3. 然后我读到这里的一个问题中没有提到的答案之一,调用重绘/重新确认直接,而是改变底层数据模型,它会自动调用上述方法。

我不知道该怎么去做。任何人都可以提供一个洞察什么是实现这一目标的正确方法?

+3

听起来你错过了一个convertRowIndexToModel的地方(假设状态在其他地方举行) – kleopatra

+0

这是一个很好的指针kleopatra ...我正在研究这个方向,这可能最终导致解决方案。谢谢,我会在这里评论所有更新:) – mayur

+0

我读了关于TableRowSorter的文档。它说:“JTable的基于行的方法和JTable的选择模型引用了视图而不是基础模型,因此有必要在两者之间进行转换。例如,要根据myModel获得选择,您需要将索引”。 它提供了一个利用convertRowIndexToModel()的代码。这意味着我的一般策略应该是将MouseListener与JTableHeader关联,并在mouseClicked()调用每行的convertRowIndexToModel时,然后在表上调用repaint()/ revalidate()。这种方法是否正确? – mayur

回答

7

对于JTable中改变细胞的颜色与setAutoCreateRowSorter(真)我在的TableCellRenderer使用的方法table.getRowSorter()。convertRowIndexToModel(行)

import javax.swing.*; 

import javax.swing.table.DefaultTableCellRenderer; 

import javax.swing.table.TableModel; 

import java.awt.*; 

public class OwnTableCellRenderer extends DefaultTableCellRenderer { 

    public OwnTableCellRenderer() { 
     super(); 
     setOpaque(true); 
    } 

    public Component getTableCellRendererComponent(JTable table, 
                Object value, 
                boolean isSelected, 
                boolean hasFocus, 
                int row, 
                int column) { 

     setBackground(Color.white); 
     setForeground(Color.black); 

     TableModel model = table.getModel(); 
     int modelRow = table.getRowSorter().convertRowIndexToModel(row); 
     int columnStatusPosition = 5; 
     String statusColumnValue = (String) model.getValueAt(modelRow, columnStatusPosition); 

     if (statusColumnValue.equals("ACTIVE")) { 
      if (isSelected) { 
       setBackground(Color.green); 
      } else { 
       setBackground(Color.yellow); 
      } 
     } 

     setText(value != null ? value.toString() : ""); 
     return this; 
    } 
} 

然后

table.setDefaultRenderer(Object.class, new OwnTableCellRenderer()); 
+0

这一个解决我的问题。谢谢你upvoted。 –

+0

伟大的解决方案。谢谢 –