首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随着TableCellEditor的消失而消失的JPanel

随着TableCellEditor的消失而消失的JPanel
EN

Stack Overflow用户
提问于 2011-11-24 23:04:00
回答 1查看 857关注 0票数 2

我已经制作了一个显示JPanel的自定义TableCellRenderer。当JPanel包含交互式元素时,我希望这些元素也能工作,所以我做了一个自定义的TableCellEditor。它可以工作,但在JPanels中单击时会出现一些奇怪的行为。有时,单击时JPanel会消失。当我只设置一个自定义渲染器时,除了JPanels不是交互式的之外,没有任何问题。所以问题一定出在TableCellEditor上。

编辑:

代码语言:javascript
复制
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;
        }
    }
}

渲染器:

代码语言:javascript
复制
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);
        }
    }
}

在主窗体中,我有下面的代码:

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-24 23:27:19

我在这里看到了两个问题:

*重复放置AWT/SWING组件是不可取的!*

1)将同一组件添加两次会导致问题。Swing不喜欢相同的组件存在于不同的位置- gui的状态,绘图等,都是基于一个组件的模型--一个位置。我以前也遇到过和你类似的问题,一个组件因为被多次添加而变成空白……

缺少变量?

2)在代码中没有定义变量jPanel1/jPanel2。我假设这在您的实际代码中不是问题-所以如果您显示这些定义,可能会有其他问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8259103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档