Как установить цвет моей 1-й строки в моем JTable на любой цвет и сохранить предыдущие установленные цвета в таблице

Я уже много читал о CellRendering в Java, и я также посетил другие Q & Начиная с этого замечательного сайта. К сожалению, я до сих пор не нашел решения для следующей проблемы:

Я хочу отобразить JTable, который отображает StatusEvents - это необходимо для мониторинга запущенной системы. Однако эти StatusEvents состоят из метки времени, текста и цвета.

Моя цель - включить несколько цветных строк. Для этого я уже определил новый JTable-подкласс (Overloading) getCellRenderer, связанный с строкой, которая раскрашивается во время процесса фильтрации) и новый подклассу TableCellRenderer, который применяет цвет к ячейке.

Методы выглядят следующим образом:

MyCustomJTable:

@Override
 public TableCellRenderer getCellRenderer(int row, int column) {
 TableCellRenderer result = super.getCellRenderer(row, column);
 if ( row == 0 )
 {
 result = colcr;
 } 
 return result;
 }

colcr - это мой пользовательский CellRenderer, который окрашивает ячейку в определенный цвет, который устанавливается ранее.

Новый Cell Renderer выглядит следующим образом:

public class ColorCellRenderer extends DefaultTableCellRenderer {
 ColorCellRenderer ( )
 {
 this.m_Color = null;
 }
 @Override
 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 ( m_Color != null )
 {
 if ( row == 0 && column == 0)
 {
 c.setForeground(m_Color); 
 }
 }
 return c;
 } 
 public void setColor ( Color c )
 {
 this.m_Color = c;
 }
 private Color m_Color;
}

К сожалению, текущее решение окрашивает только первую строку в последнем настроенном цвете, но ранее окрашенные строки теряют свой цвет и форматируются по умолчанию.

Какие возможности я должен избегать этого поведения?

искренне

Маркус

2 ответа

например, используя prepareRenderer()

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
public class TablePrepareRenderer extends JFrame {
 private static final long serialVersionUID = 1L;
 private JTable table;
 public TablePrepareRenderer() {
 Object[] columnNames = {"Type", "Company", "Shares", "Price"};
 Object[][] data = {
 {"Buy", "IBM", new Integer(1000), new ******(80.50)},
 {"Sell", "MicroSoft", new Integer(2000), new ******(6.25)},
 {"Sell", "Apple", new Integer(3000), new ******(7.35)},
 {"Buy", "Nortel", new Integer(4000), new ******(20.00)}
 };
 DefaultTableModel model = new DefaultTableModel(data, columnNames);
 table = new JTable(model) {
 private static final long serialVersionUID = 1L;
 @Override
 public Class getColumnClass(int column) {
 return getValueAt(0, column).getClass();
 }
 @Override
 public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
 Component c = super.prepareRenderer(renderer, row, column);
 int firstRow = 0;
 int lastRow = table.getRowCount() - 1;
 if (row == lastRow) {
 ((JComponent) c).setBackground(Color.red);
 } else if (row == firstRow) {
 ((JComponent) c).setBackground(Color.blue);
 } else {
 ((JComponent) c).setBackground(table.getBackground());
 }
 /*if (!isRowSelected(row)) {
 String type = (String) getModel().getValueAt(row, 0);
 c.setBackground("Buy".equals(type) ? Color.GREEN : Color.YELLOW);
 }
 if (isRowSelected(row) && isColumnSelected(column)) {
 ((JComponent) c).setBorder(new LineBorder(Color.red));
 }*/
 return c;
 }
 };
 table.setPreferredScrollableViewportSize(table.getPreferredSize());
 JScrollPane scrollPane = new JScrollPane(table);
 getContentPane().add(scrollPane);
 }
 public static void main(String[] args) {
 TablePrepareRenderer frame = new TablePrepareRenderer();
 frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
 frame.pack();
 frame.setLocationRelativeTo(null);
 frame.setVisible(true);
 }
}


Вы должны сохранить состояние, необходимое для того, чтобы средство визуализации применило ожидаемый цвет в указанном месте в любое время. Качели не будут помнить цвет для вас.

Вероятно, вы хотите получить цвет из StatusEvents, отображаемого в вашей таблице. В этом случае вы должны прочитать статус в рендерере и применить соответствующий цвет.

licensed under cc by-sa 3.0 with attribution.