如何更改具有特定列值的JTable整行的颜色

时间:2013-03-25 04:42:11

标签: java swing jtable tablecellrenderer

我有一个Jtable,它从一组值中填充。 我的代码是这样的:

  private static final String[] columnNames = {"Line Number", "Error","Fix Proposed","Percentage (%)"};
  static DefaultTableModel model = new DefaultTableModel(null,columnNames);

  public static void DisplayMyJList(List<CaptureErrors> x,String extension,
        ArrayList<Integer> l,ArrayList<Integer> p,
        ArrayList<String> e,ArrayList<String> s) throws IOException {//Method to Dynamic get values to be populated in Jtable.

    String theExtension = extension;
    if(FILE_EXTENSION.equals("java")) {
        for(CaptureErrors ex: x) {

            Vector row = new Vector();
            row.add(ex.getLinenumber());
            row.add(ex.getMyfounderror());
            row.add(ex.getMycorrection());
            row.add(ex.getMyPercentage()+"%");

            model.addRow( row );

            //model.setRowColour(1, Color.YELLOW);
        }
    }

table = new JTable(model);
    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);    
    table.setFillsViewportHeight(true);
    table.setShowGrid(true);
    table.setShowVerticalLines(true);
    table.setGridColor(new Color(0,128,0));
    JTableHeader header = table.getTableHeader();
    table.setBackground(new Color(255,228,225));
    table.setEnabled(true);
    header.setFont(new Font("Dialog", Font.CENTER_BASELINE, 12));
    header.setBackground(Color.black);
    header.setForeground(Color.yellow);
    JScrollPane pane4 = new JScrollPane(table); 

我可以通过使用JButton从值数组填充Jtable。 我想要一个条件,如果列“百分比”,获取此列中的所有值&gt; 30,它会将行突出显示为color.red。

我不想使用TableCellRendererComponent。我希望在单击Jbutton时执行此操作。

实际的Jtable看起来像这样: enter image description here

然后根据我想要的内容,前两行应以红色突出显示。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:7)

请参阅Table Row Rendering中的方法,了解无需创建自定义渲染器的解决方案。

您可能还想查看Table Format Renderers,以便轻松格式化百分比列。

答案 1 :(得分:5)

渲染API的一个问题是难以提供复合渲染器。有办法做,不要误会我的意思,但内置它会很好...... [结束咆哮] ......

基本思路是,您要设置一系列渲染器,这些渲染器从基础渲染器扩展而来,该渲染器包含确定在所需条件下应该执行的操作所需的逻辑。

public class FilterRenderer extends DefaultTableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
        Double percent = (Double) table.getValueAt(row, 3);
        // You'll need some way to supply the filter value, may via a centralised 
        // manager of some kind.
        if (percent > 0.3 && !isSelected) {
            setOpaque(true);
            setBackground(Color.RED);
        } else {
            setOpaque(false);
        }
        return this;
    }
}

public class OtherCellRenderer extends FilterRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
        // Apply any special renderer requirements, like translating an object value to String
        return this;
    }
}

您需要为每列提供自定义渲染器(从您的示例,即第4列)并将每个列应用于表格列

TableColumnModel model = table.getColumnModel();
model.getColumn(0).setCellRenderer(new LineNumberRenderer());
model.getColumn(1).setCellRenderer(new ErrorRenederer());
model.getColumn(2).setCellRenderer(new FixProposedRenderer());
model.getColumn(3).setCellRenderer(new Percentage());

或者您可以使用内置支持行突出显示器的SwingLabs JXTable

答案 2 :(得分:4)

您可以创建自定义单元格渲染器。在其实施中,检查百分比值是否> 30为给定行,然后突出显示此单元格。

例如:

class SomeRenderer 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 (isHighlightingEnabled){
            Integer percentage = (Integer) table.getValueAt(row, 3);
            if (percentage > 30)
                c.setBackground(Color.RED);
        }
        return c;
    }
}

如果需要,您可以根据操作启用/禁用此渲染逻辑。

有关详细信息,请参阅Using Custom Renderers