3

私は基本的に、特定の情報を表示する JTree を持っています。「サブツリー」の 1 つで、GridLayout(0,2) のパネルと JPanel、およびコンボボックスで構成されるパネルを取得しました。

ツリー内のコンポーネントが入力に反応しないことに気付きました。これはもちろん、クリックしようとしてもコンボボックスが反応しないことを意味します。デフォルトのセル エディタを実装しようとしましたが、うまくいきましたが、私が望んでいたものではありませんでした。基本的にメニューを開きましたが、アイテムの1つを選択するとJLabelが置き換えられたため、コンボボックスのみが表示されました。

ピクチャー

ボックスをクリックする前にここに画像の説明を入力

ボックスをクリックした後ここに画像の説明を入力

私が試したコード

 TreeCellEditor editor = new DefaultCellEditor(blockedAlternatives);
                infoTree.setEditable(true);
                infoTree.setCellEditor(editor);

ツリー全体を編集できるようにしたくないのは明らかです。コンボボックスのメニューを表示できるようにしたいだけです。テストのためにこのコードをWebから取得しました。何か案は?

4

1 に答える 1

4

基本的にメニューを開きましたが、アイテムの1つを選択するとJLabelが置き換えられたため、コンボボックスのみが表示されました。

それはあなたが期待するものであり、それDefaultCellEditor(JComboBox jcb)が意図されている方法です:

    import java.awt.BorderLayout;
    import java.util.Properties;
    import javax.swing.*;
    import javax.swing.tree.TreeCellEditor;

    public class TreeEditJComboBox {

        public static void main(String args[]) {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Properties props = System.getProperties();
            JTree tree = new JTree(props);


            JComboBox comboBox = new JComboBox(new String[]{"A", "B", "C"});
            TreeCellEditor editor = new DefaultCellEditor(comboBox);

            tree.setEditable(true);
            tree.setCellEditor(editor);

            JScrollPane scrollPane = new JScrollPane(tree);
            frame.add(scrollPane, BorderLayout.CENTER);
            frame.setSize(300, 150);
            frame.setVisible(true);
        }

    }
}

独自のDefaultCellEditorオーバーライドを作成してから、 andを保持するgetTableCellEditorComponent()a を返すことができます。次のようなものです。JPanelJLabelJComboBox

class MyDefaultCellEditor extends DefaultCellEditor {

public MyDefaultCellEditor(JComboBox comboBox) {
    super(comboBox);
}

@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
   //return custom coponent
    return super.getTableCellEditorComponent(table, value, isSelected, row, column);
}
}

それから:

 TreeCellEditor editor = new MyDefaultCellEditor(blockedAlternatives);

他のいくつかのメソッドもオーバーライドする必要がある場合があります。論理を示しただけ

参考文献:

于 2012-08-19T18:48:26.667 に答える