JTable的单元格渲染器 – 彩色行

我一直在四处寻找解决方案,我不能从不同的地方做头或尾,如何让我的桌子做有色行而不问我自己的问题。

从我看过的每一个地方,我都需要使用一个细胞渲染器,但问题是我不知道如何将它应用到我自己的情况。

所以我有一个简单的JTable 3列,我只想让每一行以绿色,黄色或红色突出显示,具体取决于单独变量的值(表中未显示)。

看起来它应该非常简单,但我无法做到这一点。 如果它有助于我的表定义如下:

studentTableModel = new DefaultTableModel(new Object[]{"Name", "StudentNo", "Part"}, 0); jt_studentTable = new JTable(studentTableModel); jt_studentTable.getColumnModel().getColumn(2).setPreferredWidth(10); studentTableModel.addRow(new Object[]{"(empty)", "(empty)", "(empty)"}); JScrollPane jsp_tableScroller = new JScrollPane(jt_studentTable); jsp_tableScroller.setPreferredSize(new Dimension(200,190)); middleCentrePanel.add(jsp_tableScroller); 

表中的行根据combobox的选择而变化。

提前致谢。

JTable细胞着色

 import java.awt.Color; import java.awt.Component; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; public class RowRendering { private static Object[] columnName = {"Yes", "No"}; private static Object[][] data = { {"Y", "N"}, {"N", "Y"}, {"Y", "N"} }; public static void main(String[] args) { Runnable r = new Runnable() { @Override public void run() { JFrame frame = new JFrame(); JTable table = new JTable(data, columnName); table.getColumnModel().getColumn(0).setCellRenderer(new CustomRenderer()); table.getColumnModel().getColumn(1).setCellRenderer(new CustomRenderer()); frame.add(new JScrollPane(table)); frame.setTitle("Rendering in JTable"); frame.pack(); frame.setVisible(true); } }; EventQueue.invokeLater(r); } } class CustomRenderer extends DefaultTableCellRenderer { private static final long serialVersionUID = 6703872492730589499L; public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component cellComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); if(row == 0){ cellComponent.setBackground(Color.YELLOW); } else if ( row == 1){ cellComponent.setBackground(Color.GRAY); } else { cellComponent.setBackground(Color.CYAN); } return cellComponent; } } 

我只想让每一行以绿色,黄色或红色突出显示,具体取决于单独变量的值(不在表中显示)。

渲染器处理表中的数据。 这就是组件只有在拥有完成工作所需的所有信息时才能自行绘制。

所以你需要将信息添加到表中。 这可能是添加隐藏的第4列。 然后该表仍然可以访问所需的信息。

那么也许你可以使用Table Row Renderering中的建议。

也许这适合你:

 class MyCellRenderer extends DefaultTableCellRenderer { String separatedVariable; public MyCellRenderer(String separatedVariable) { this.separatedVariable = separatedVariable; } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); c.setBackground(Color.WHITE); c.setForeground(Color.BLACK); JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); if (separatedVariable.equals("YOUR VALUE TO GREEN")) { l.setBackground(Color.GREEN); return l; } else { if (separatedValue.equals("YOUR VALUE TO YELLOW")) { l.setBackground(Color.YELLOW); return l; } else if (separatedValue.equals("YOUR VALUE TO RED")) { l.setBaground(Color.RED); return l; } } return c; } } 

我只是有同样的问题,但有点复杂,因为我已经为每列提供了几个不同的渲染器,具体取决于数据类型。

但我发现这就像一个魅力:

 public class MyTable extends JTable { @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component result = super.prepareRenderer(renderer, row, column); if (mustBeYellow(row, column)) { result.setBackground(Color.yellow); } return result; } private boolean mustBeYellow(int row, int column) { // implement this depending on your data.. return false; } }