JPanel как TableCellEditor исчезает

Я сделал собственный TableCellRenderer, который отображает JPanel. Когда JPanel содержит интерактивные элементы, я хочу, чтобы они тоже работали, поэтому я создал собственный TableCellEditor. Это работает, но есть какое-то странное поведение при нажатии на JPanels. Иногда JPanel исчезает при нажатии. Когда я устанавливаю только собственный рендерер, проблем вообще нет, за исключением того, что JPanels не являются интерактивными. Так что проблема должна быть в TableCellEditor.

Редактор:

public class PanelTableCellEditor
        extends AbstractCellEditor
        implements TableCellEditor
{
    private Object _component;

    @Override
    public Object getCellEditorValue()
    {
        return _component;
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value,
                                                 boolean isSelected, int row,
                                                 int column)
    {
        _component = value;
        if (value instanceof JPanel)
        {
            ((Component) value).setForeground(UIManager.getColor("List.selectionForeground"));
            ((Component) value).setBackground(UIManager.getColor("List.selectionBackground"));
            return ((Component) value);
        }
        else
        {
            return null;
        }
    }
}

Рендерер:

public class PanelTableCellRenderer
        extends Component
        implements TableCellRenderer
{
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
                                                   boolean isSelected,
                                                   boolean hasFocus, int row,
                                                   int column)
    {
        if (value instanceof JPanel)
        {
            if (isSelected || hasFocus)
            {
                ((Component) value).setForeground(UIManager.getColor("List.selectionForeground"));
                ((Component) value).setBackground(UIManager.getColor("List.selectionBackground"));
            }
            else
            {
                ((Component) value).setForeground(UIManager.getColor("Panel.foreground"));
                ((Component) value).setBackground(UIManager.getColor("Panel.background"));
            }

            return ((Component) value);
        }
        else
        {
            return new DefaultTableCellRenderer().getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        }
    }
}

В основной форме у меня есть следующий код:

DefaultTableModel model = new DefaultTableModel();
        model.addColumn(null, new Object[]
                {
                    jPanel1, jPanel2, jPanel1, jPanel2, jPanel1, jPanel2, jPanel1, jPanel2, jPanel1, jPanel2, jPanel1
                });
        jTable1.setModel(model);
        TableColumn column = jTable1.getColumnModel().getColumn(0);
        column.setCellRenderer(new PanelTableCellRenderer());
        column.setCellEditor(new PanelTableCellEditor());
        jTable1.setRowHeight(50);
        jTable1.setTableHeader(null);
        jScrollPane2.setColumnHeaderView(null);

person siebz0r    schedule 24.11.2011    source источник
comment
пожалуйста, прочитайте stackoverflow.com/questions/5555938/   -  person mKorbel    schedule 24.11.2011


Ответы (1)


Я вижу здесь две проблемы:

*Дублирование компонентов AWT/SWING запрещено! *

1) Дважды добавление одного и того же компонента на панель вызывает проблемы. Swing не любит, когда один и тот же компонент находится в разных местах — состояние графического интерфейса, отрисовка и т. д. основаны на модели одного компонента — одного местоположения. У меня были проблемы, похожие на ваши, в прошлом, когда компонент оставался пустым, потому что он добавлялся несколько раз...

Отсутствуют переменные?

2) Переменные jPanel1/jPanel2 нигде в вашем коде не определены. Я предполагаю, что это не проблема в вашем реальном коде, хотя --- поэтому, возможно, если вы покажете эти определения, могут возникнуть другие проблемы.

person jayunit100    schedule 24.11.2011
comment
Панели определяются и создаются в другом месте. Тот факт, что есть повторяющиеся элементы, объясняет ситуацию. Я предполагал, что свинг справится с этим. - person siebz0r; 24.11.2011