Как установить цвет моей 1-й строки в JTable на любой цвет И сохранить предыдущие установленные цвета в таблице
Я уже много читал о CellRendering на Java, а также посетил другие вопросы и ответы с этого замечательного сайта. К сожалению, я до сих пор не нашел решение для следующей проблемы:
Я хочу визуализировать JTable, который отображает StatusEvents - это необходимо для мониторинга работающей системы. Однако эти StatusEvents состоят из метки времени, текста и цвета.
Моя цель - включить несколько цветных рядов. Чтобы достичь этого, я уже определил новый подкласс JTable (перегрузка) getCellRenderer, связанный со строкой, которая рисуется во время процесса вставки), и новый подкласс TableCellRenderer-Subclass, который применяет цвет к ячейке.
Методы выглядят следующим образом:
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;
}
К сожалению, текущее решение окрашивает только первую строку в последний настроенный цвет, но ранее окрашенные строки теряют свой цвет и форматируются по умолчанию.
Какие у меня есть возможности, чтобы избежать такого поведения?
Искренне
Markus
2 ответа
Вы должны сохранить состояние, необходимое для средства визуализации, чтобы в любой момент применить ожидаемый цвет в указанном месте. Качели не запомнят для вас цвет.
Вы, вероятно, хотите получить цвет из StatusEvents, отображаемых в вашей таблице. В этом случае вы должны прочитать статус в рендере и применить соответствующий цвет.
Например, используя 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 Double(80.50)},
{"Sell", "MicroSoft", new Integer(2000), new Double(6.25)},
{"Sell", "Apple", new Integer(3000), new Double(7.35)},
{"Buy", "Nortel", new Integer(4000), new Double(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);
}
}