JPanel как TableCellEditor исчезает - PullRequest
2 голосов
/ 24 ноября 2011

Я создал пользовательский 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;
        }
    }
}

Renderer:

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);

1 Ответ

1 голос
/ 24 ноября 2011

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

* Повторно размещенные компоненты AWT / SWING - нет-нет!*

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...