Изменение цвета ячеек Java JTable

Я хотел бы сделать редактируемую таблицу, а затем проверить данные, чтобы убедиться, что она действительна. Я не уверен, как изменить цвет только одной ячейки. Я хотел бы получить ячейку, например (0,0), и окрасить передний план в красный. Я прочитал другие сообщения на SO, а также Oracle о пользовательском ColorRenderer, но я просто не понимаю, как это использовать.

Благодарю.

Скажем, что ячейка, которую вы хотите отобразить другим цветом, представляет собой статус (в качестве примеров я возьму Отклонение и Утверждение). Затем я реализую метод в моей табличной модели с именем 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; } 

Затем, когда средство визуализации на месте, просто «примените» средство визуализации к таблице со следующим fragmentом кода:

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

Что касается редактирования ячейки, просто реализуйте метод isCellEditable (int rowIndex, int columnIndex) в вашей модели таблицы. Вам также необходимо реализовать метод setValueAt (значение Object, 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); } } 

Самый простой способ – написать простой TableCellRenderer , расширив DefaultTableCellRenderer и переписав метод setBackground( Color.RED ) в setBackground( Color.RED ) . Например:

 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.

Сначала просто создайте простой class 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; } 
  • Как сохранить настройки пользовательских настроек в Java?
  • Java: как сделать двойную буферизацию в Swing?
  • Как я могу сохранить состояние своей программы и загрузить ее?
  • Почему JScrollPane в JOptionPane не показывает весь его контент?
  • Почему setSelected on JCheckBox теряет эффект?
  • Как правильно использовать собственные средства визуализации для рисования конкретных ячеек в JTable?
  • Сохранение правильного стиля при поиске текста
  • Как обмениваться данными с двумя (2) classами SwingWorker в Java
  • Сделать JScrollPane управление несколькими компонентами
  • Как «Открыть» и «Сохранить» с помощью java
  • изображения не загружаются
  • Давайте будем гением компьютера.