使用自定义单元格编辑器在选择时奇怪地闪烁单元格

时间:2009-08-26 13:22:54

标签: java swing jtable tablecelleditor

我刚接触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();
    }
}

1 个答案:

答案 0 :(得分:0)

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