【问题标题】:Strange blinking of cell on selection with custom Cell Editor使用自定义单元格编辑器选择单元格时奇怪的闪烁
【发布时间】:2010-11-23 00:12:23
【问题描述】:

我是使用 JTables 的新手,并且无法让我的自定义 JTable 编辑器正常工作。

我有许多带有列表和按钮的自定义面板。为了在单元格中渲染它们,我使用了一个自定义 PanelCellRenderer,它为每种类型的面板提供了各种构造函数。

为了使按钮可点击,我创建了这个简单的 PanelCellEditor,它扩展了 DefaultCellEditor。要在编辑时访问存储在单元格中的数据,我将引用传递给 PanelCellRenderer。

我遇到的问题是,当我选择单元格(通过单击它)时,从显示带有按钮的列表开始,所选单元格变得完全空白。当单元格被取消选择时,带有数据的列表和按钮再次出现。对此的任何建议都会有所帮助。谢谢。

public class PanelCellEditor extends DefaultCellEditor {

    private PanelCellRenderer pcr;
    private Object value;

    public PanelCellEditor(final PanelCellRenderer pcr) {
        super(new JCheckBox());
        this.pcr = pcr;
        this.pcr.setOpaque(true);

        if (pcr.firstPanel != null) {

            pcr.firstPanel.Button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    //do something
                    fireEditingStopped();
                }
            });

            pcr.firstPanel.List.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent e) {
                    String value = (String) ((javax.swing.JList) e.getSource()).getSelectedValue();
                    //do something
                    fireEditingStopped();
                }
            });
        }
        else if (pcr.secondPanel != null) {

            pcr.secondPanel.Button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    //do something
                    fireEditingStopped();
                }
            });

            pcr.secondPanel.List.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent e) {
                    String value = (String) ((javax.swing.JList) e.getSource()).getSelectedValue();
                    //do something
                    fireEditingStopped();
                }
            });
        }
    }

    public Component getTableCellEditorComponent(JTable table, Object value,
        boolean isSelected, int row, int column) {

        //// if I comment this whole bit ////
        if (isSelected) {
            pcr.setForeground(table.getSelectionForeground());
            pcr.setBackground(table.getSelectionBackground());
        } else {
            pcr.setForeground(table.getForeground());
            pcr.setBackground(table.getBackground());
        }

        if (pcr.firstPanel != null)
            pcr.firstPanel.list.setListData((String[])value);
        else if (pcr.secondPanel != null) {
            pcr.secondPanel.list.setListData((String[])value);
        }
        //////// nothing changes /////////

        this.value = value;
        return pcr;
    }

    public Object getCellEditorValue() {
        return value;
    }

    public boolean stopCellEditing() {
        return super.stopCellEditing();
    }

    protected void fireEditingStopped() {
        super.fireEditingStopped();
    }
}

【问题讨论】:

    标签: java swing jtable tablecelleditor


    【解决方案1】:

    您可以将 JTable.getTableCellEditor 跟踪到您的对象中。 您是否真的使用 Jtable 编辑的值注册了您的编辑器?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 2017-03-24
      • 2012-08-05
      相关资源
      最近更新 更多