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

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

private static final String[] columnNames = {"Line Number", "Error","Fix Proposed","Percentage (%)"}; static DefaultTableModel model = new DefaultTableModel(null,columnNames); public static void DisplayMyJList(List x,String extension, ArrayList l,ArrayList p, ArrayList e,ArrayList 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。 我希望有一个条件,如果列“百分比”,获取此列中的所有值> 30,它会突出显示为color.red的行。

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

实际的Jtable看起来像这样: 在此处输入图像描述

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

渲染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 ,它具有内置支持行高亮JXTable

在不创建自定义渲染器的情况下,请参阅表行渲染中的方法以获得解决方案。

您可能还想查看表格式渲染器,以便轻松格式化百分比列。

您可以创建自定义单元格渲染器。 在其实现中,检查给定行的百分比值是否> 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; } } 

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

有关更多详细信息,请参阅使用自定义渲染器 。