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

Я уже много читал о 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;

}

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

Какие у меня есть возможности, чтобы избежать такого поведения?

искренне

Маркус

Ответы [ 2 ]

1 голос
/ 02 августа 2011

например, используя 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);
    }
}
1 голос
/ 02 августа 2011

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

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

...