java - JPanel 作为 TableCellEditor 消失

标签 java swing jpanel tablecellrenderer tablecelleditor

我制作了一个显示 JPanel 的自定义 TableCellRenderer。当 JPanel 包含交互式元素时,我希望它们也能工作,所以我制作了一个自定义 TableCellEditor。它可以工作,但是单击 JPanel 时会出现一些奇怪的行为。有时 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);

最佳答案

我在这里看到两个问题:

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

1) 将相同的组件添加到面板两次会导致问题。 Swing 不喜欢同一个组件存在于不同的位置——gui 的状态、去绘图等,都是基于一个组件的模型——一个位置。我过去遇到过与您类似的问题,其中一个组件因为被多次添加而变成空白......

缺少变量?

2) 变量 jPanel1/jPanel2 没有在你的代码中的任何地方定义。不过,我认为这在您的实际代码中不是问题 --- 所以如果您显示这些定义,可能会出现其他问题。

关于java - JPanel 作为 TableCellEditor 消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8259103/

相关文章:

java - 在 Swing 中关闭 Flash 屏幕

java - 嵌套 JPanel 调整大小问题

java - findbugs 提示 Eclipse 的自动生成代码

java - 是否可以使用异常作为条件?

java - 如何在java中重新创建单例类

java - 如何访问标准 Eclipse 图标

java - 在 Java Swing 中打印发票和类似文档的工具是什么?

Java Swing 网格布局 : Accessing Specific Coordinate

java - 如何摆脱 Java 中 MigLayout 的自动插入?

java - 通过代码 View 在 netbeans 中添加 JComponent