我已经在Java中阅读了很多关于CellRendering的内容,我也访问了其他Q& As这个伟大的网站。不幸的是,我仍然没有找到以下问题的解决方案:
我想呈现一个显示StatusEvents的JTable - 这对于监视正在运行的系统是必需的。但是,这些StatusEvent包含时间戳,文本和颜色。
我的目标是启用多个彩色行。为了实现这一点,我已经定义了一个新的JTable子类(重载“与在Rowing过程中被绘制的Row相关的getCellRenderer)和一个新的TableCellRenderer-Subclass,它将Color应用于Cell。
方法如下所示:
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进行着色。
新的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;
}
不幸的是,当前的解决方案只是最新配置颜色的第一行,但以前的彩色行会丢失颜色并默认格式化。
我有哪些可能性来避免这种行为?
真诚
马库斯
答案 0 :(得分:1)
您必须保留渲染器在任何时间在指定位置应用预期颜色所需的状态。 Swing不会记住你的颜色。
您可能希望从表格中显示的StatusEvents中获取颜色。在这种情况下,您必须在渲染器中读取状态并应用相应的颜色。
答案 1 :(得分:1)
例如,使用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);
}
}