Java JTable改变单元格颜色

我想制作一个可编辑的表格,然后检查数据以确保其有效。 我不知道如何改变一个细胞的颜色。 我想得到一个单元格,例如(0,0)并将前景颜色变为红色。 我已经阅读了SO以及Oracle关于自定义ColorRenderer的其他post,但我只是不知道如何使用它。

谢谢。

假设您想要使用不同颜色渲染的单元格表示状态(我将以“拒绝和已批准”为例)。 然后我在我的表模型中实现一个名为getStatus(int row)的方法,它返回任何给定行的状态。

然后,当它到位时,我将创建一个单元格渲染器,负责渲染单元格所属的列。 单元格渲染器将在下面的代码行中。

public class StatusColumnCellRenderer extends DefaultTableCellRenderer { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { //Cells are by default rendered as a JLabel. JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); //Get the status for the current row. CustomTableModel tableModel = (CustomTableModel) table.getModel(); if (tableModel.getStatus(row) == CustomTableModel.APPROVED) { l.setBackground(Color.GREEN); } else { l.setBackground(Color.RED); } //Return the JLabel which renders the cell. return l; } 

然后,当渲染器到位时,只需使用以下代码“将”渲染器“应用”到表中:

 Table.getColumnModel().getColumn(columnIndex).setCellRenderer(new StatusColumnCellRenderer()); 

关于使单元格可编辑,只需在表模型中实现isCellEditable (int rowIndex,int columnIndex)方法即可。 如果你想保留用户提供的值(我假设你这样做了!),你还需要实现方法setValueAt (Object value,int rowIndex,int columnIndex)。

我想制作一个可编辑的表格,然后检查数据以确保其有效。

另一种方法是在将数据保存到表模型之前编辑数据,以防止输入无效数据。

 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.text.*; import javax.swing.event.*; import javax.swing.border.*; import javax.swing.table.*; public class TableEdit extends JFrame { TableEdit() { JTable table = new JTable(5,5); table.setPreferredScrollableViewportSize(table.getPreferredSize()); JScrollPane scrollpane = new JScrollPane(table); getContentPane().add(scrollpane); // Use a custom editor TableCellEditor fce = new FiveCharacterEditor(); table.setDefaultEditor(Object.class, fce); } class FiveCharacterEditor extends DefaultCellEditor { FiveCharacterEditor() { super( new JTextField() ); } public boolean stopCellEditing() { try { String editingValue = (String)getCellEditorValue(); if(editingValue.length() != 5) { JTextField textField = (JTextField)getComponent(); textField.setBorder(new LineBorder(Color.red)); textField.selectAll(); textField.requestFocusInWindow(); JOptionPane.showMessageDialog( null, "Please enter string with 5 letters.", "Alert!",JOptionPane.ERROR_MESSAGE); return false; } } catch(ClassCastException exception) { return false; } return super.stopCellEditing(); } public Component getTableCellEditorComponent( JTable table, Object value, boolean isSelected, int row, int column) { Component c = super.getTableCellEditorComponent( table, value, isSelected, row, column); ((JComponent)c).setBorder(new LineBorder(Color.black)); return c; } } public static void main(String [] args) { JFrame frame = new TableEdit(); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo( null ); frame.setVisible(true); } } 

最直接的方法是通过扩展DefaultTableCellRenderer并将getTableCellRendererComponent方法覆盖为setBackground( Color.RED )来编写一个简单的TableCellRenderer 。 例如:

 final JTable table = new JTable(...); table.setCellRenderer( new DefaultTableCellRenderer() { public Component getTableCellRenderer(JTable table, Object value, ...) { super.getTableCellRenderer(...); if ( value should be highlighted ) { setBackground( Color.RED ); } return this; } }); 

这是为jTable中的特定列或单元着色的最简单方法。

首先,只需创建一个简单的CustomRenderer

 class CustomRenderer 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); setForeground(Color.blue); > return c; } }

此代码获取要呈现的单元格列

 TableColumn col = tblExamHistoryAll.getColumnModel().getColumn(5); DefaultTableModel model3 = (DefaultTableModel)tblExamHistoryAll.getModel(); col.setCellRenderer(new CustomRenderer()); 

这是为了清除表中的所有先前行。 如果您不想要它们,只需删除这些行

 model3.getDataVector().removeAllElements(); model3.fireTableDataChanged(); 

我相信在表格中进行着色的正确方法是使用ColorHighlighter表格渲染器在同一列中呈现不同颜色存在问题。

这是一个如何使用荧光笔的例子。 在这种情况下,它用于突出显示不可编辑的单元格。

 public class IsCellEditablePredicate implements HighlightPredicate { private JXTable table; public IsCellEditablePredicate (final JXTable table) { this.table = table; } @Override public boolean isHighlighted(Component component, ComponentAdapter componentAdapter) { return !table.isCellEditable(componentAdapter.row, componentAdapter.column); } 

}

然后在您的代码中设置表格,添加荧光笔及其颜色参数:

  ColorHighlighter grayHighlighter = new ColorHighlighter(new IsCellEditablePredicate(table)); grayHighlighter.setBackground(Color.LIGHT_GRAY); grayHighlighter.setForeground(table.getForeground()); grayHighlighter.setSelectedBackground(table.getSelectionBackground().darker()); grayHighlighter.setSelectedForeground(table.getSelectionForeground().darker()); table.setHighlighters(grayHighlighter); 
 @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); int control = row; control = control % 2; control = (control == 0) ? 1 : 0; if (control == 1) { c.setBackground(Color.green); } else { c.setBackground(Color.cyan); } return c; }