如何将我的JTable中第一行的颜色设置为任何颜色并保留表中的先前设置颜色

时间:2011-08-02 07:50:59

标签: java swing colors jtable row

我已经在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;

}

不幸的是,当前的解决方案只是最新配置颜色的第一行,但以前的彩色行会丢失颜色并默认格式化。

我有哪些可能性来避免这种行为?

真诚

马库斯

2 个答案:

答案 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);
    }
}