如何更改具有特定列值的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; } }
如果需要,您可以根据操作启用/禁用此渲染逻辑。
有关更多详细信息,请参阅使用自定义渲染器 。