Почему смешанные результаты в рендеринге условных ячеек моего JTable?

Я следил за учебными пособиями, изучая все это о JTable Renderers/Editors, но я застрял, пытаясь создать условный рендерер, предназначенный для отображения ячеек разными цветами в соответствии с набором условий.

Вот SSCCE, который я собрал:

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumnModel;

public class Demo2 extends javax.swing.JFrame {

    public Demo2() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(300, 300);
        this.getContentPane().setLayout(new java.awt.GridLayout(1, 1));
        Object[] colunas = {"Col 0"};
        Object[][] dados = {{"A"},{"B"},{"C"},{"D"}};
        JTable tbl = new JTable(dados,colunas);
        TableColumnModel tcm = tbl.getColumnModel();
        tcm.getColumn(0).setCellRenderer(new CustomCellRenderer());
        JScrollPane sp = new JScrollPane(tbl);
        this.add(sp);
    }

    class CustomCellRenderer extends DefaultTableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            Component c = super.getTableCellRendererComponent(jtable, value, isSelected, hasFocus, row, column);
            if (value.toString().equals("B")) {
                c.setForeground(Color.GREEN);
                c.setFont(c.getFont().deriveFont(Font.BOLD));
            } else if (value.toString().equals("D")) {
                c.setForeground(Color.BLUE);
                c.setFont(c.getFont().deriveFont(Font.BOLD));
            }
            return this;
        }
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Demo2().setVisible(true);
            }
        });
    }

}

Как я и ожидал, вторая ячейка имеет зеленый передний план и выделена жирным шрифтом, а четвертая — также синяя и жирная. Тем не менее, другие ячейки, по-видимому, также были затронуты изменением цвета переднего плана.

введите здесь описание изображения

При отладке с точками останова я вижу, что он выполняет setForeground только в правильных строках, хотя он выполняет оба дважды, что было неожиданно.

Кроме того, если я изменю последнюю ячейку с «D» на «DD», то передний план каждой ячейки станет зеленым.

Я думаю, что мне не хватает чего-то фундаментального в рендерерах.


person Smig    schedule 16.01.2013    source источник


Ответы (1)


Где вы «снимаете жирный шрифт» со своего шрифта, когда его не нужно выделять жирным шрифтом или менять цвета на значения по умолчанию? Помните, что это не делается автоматически, но ваш код должен делать это специально. Я думаю, что вам нужно иметь больше блоков else, чтобы иметь возможность реагировать на все случаи.

i.e.,

    @Override
    public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component c = super.getTableCellRendererComponent(jtable, value, isSelected, hasFocus, row, column);
        if (value.toString().equals("B")) {
            c.setForeground(Color.GREEN);
            c.setFont(c.getFont().deriveFont(Font.BOLD));
        } else if (value.toString().equals("D")) {
            c.setForeground(Color.BLUE);
            c.setFont(c.getFont().deriveFont(Font.BOLD));
        } else {
           c.setForeground(null);
           c.setFont(c.getFont().deriveFont(Font.PLAIN));
        }
        return this;
    }

Ячейки JTable не похожи на отдельные компоненты, а представляют собой визуализированные изображения компонента какого-либо компонента. Считайте, что они сделаны с помощью формочки для печенья. Если вы поменяете резак для одной ячейки и не поменяете его обратно, все последующие ячейки будут затронуты.

person Hovercraft Full Of Eels    schedule 16.01.2013
comment
Очень полный ответ! Спасибо. - person Smig; 16.01.2013