0

私は JTables を使用するのが初めてで、カスタム JTable エディターを適切に動作させるのに問題があります。

リストとボタンを備えた多数のカスタム パネルがあります。それらをセルにレンダリングするために、パネルのタイプごとにさまざまなコンストラクターを持つカスタム PanelCellRenderer を使用しています。

ボタンをクリックできるようにするために、DefaultCellEditor を拡張するこの単純な PanelCellEditor を作成しました。編集時にセル内に格納されたデータにアクセスするには、参照を 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();
    }
}
4

1 に答える 1

0

JTable.getTableCellEditor をオブジェクトにトレースできます。Jtable で編集する必要がある値を使用してエディターを実際に登録しましたか?

于 2009-09-01T11:19:09.203 に答える