JPanel作为TableCellEditor消失了

时间:2011-11-24 15:04:00

标签: java swing jpanel tablecellrenderer tablecelleditor

我制作了一个显示JPanel的自定义TableCellRenderer。当JPanel包含交互元素时,我希望它们也可以工作,所以我创建了一个自定义的TableCellEditor。它有效,但点击JPanels时有一些奇怪的行为。有时单击时JPanel会消失。 当我只设置自定义渲染器时,除了JPanel不是交互式之外,根本没有问题。所以问题必须在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);

1 个答案:

答案 0 :(得分:1)

我在这里看到两个问题:

* 重复放置的AWT / SWING组件是禁忌! *

1)将两次相同的组件添加到面板会导致问题。 Swing不喜欢在不同位置存在相同的组件--- gui,dedrawing等的状态都是基于一个组件的模型 - 一个位置。我过去遇到了类似的问题,因为它被多次添加,因此组件空白了......

缺少变量?

2)变量jPanel1 / jPanel2未在代码中的任何位置定义。我认为这不是你实际代码中的问题,但是 - 所以如果你展示这些定义,可能会有其他问题。