2

これは私の側からの誤解に違いありませんが、私には次のようなものがあります
。JcomboboxにItemListenerを追加しました。
アイテムリスナーで、イベントがItemSelectedタイプであるかどうかをチェックインします。
そうである場合は、JTextPaneの値を更新します。問題は、次のように機能すること
です。jcomboboxで新しい値をクリックしても、jtextfieldで何も変更されません。jtextfieldなどの別のコンポーネントをクリックする必要があります。その後、jtextfieldが更新されます。
イベントの変更がitemlistenerコードにディスパッチされるように、フォーカスをjcomboboxから削除する必要があるようです。
これはそれが機能することになっている方法ですか、それとも私は何か間違ったことをしていますか?フォーカスを外さずにイベントを処理することは可能ですか?

更新:このコードとメソッドupdateJTextPaneは、コンボから新しい値を選択したときではなく、別のコンポーネントをクリックした後に呼び出されます。つまり、コンボの値は「1」です。ドロップダウンリストをクリックして、「2」をクリックします。現在選択されているアイテムは「2」になります。この時点では、私のメソッドは呼び出されていません。2番目のコンボボックスをクリックすると、2番目のコンボにフォーカスがあり、メソッドupdateJTextPane()が呼び出されます。なんで?
更新2:

//Code from Netbeans generator
JComboBox myCbx = new javax.swing.JComboBox();    
myCbx.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
myCbx.setName("myCbx"); // NOI18N 
//My ItemListener
class myItemListener implements ItemListener{
public void itemStateChanged(ItemEvent ie) {
            if (ie.getStateChange() == ItemEvent.SELECTED) { // Item was just selected
                updateJTextPane();
            }    
         }
    }
//add item listener to combo
myCbx.addItemListener(new myItemListener());

更新3:これがわからない方法で重要な場合、内部クラスmyItemListenerが同じJDialog内のさらに5つのコンボボックスに追加されますありがとうございます

4

4 に答える 4

1

これは、動作するはずの方法ではありません。選択したアイテムが変更されるたびに、アイテム イベントをすぐに生成する必要があります。

このような単純な例から始めて、イベントが実際に生成されているかどうかを確認することをお勧めします。これが機能する場合は、これと独自のコードの違いを検索するだけで済みます。

アップデート:

あなたのitemStateChanged方法は問題ないように見えますが、問題は別の場所にあるはずです。に問題がある可能性がありupdateJTextPaneます。updateJTextPaneへの呼び出しを?に置き換えるとどうなりますSystem.out.printlnか? また、イベントのソース ( ie.getSource()) を出力して、イベントが実際に最初のコンボ ボックスから発生していることを確認できますか?

コンパイルして実行できる自己完結型の例を投稿すると、問題を特定するのがはるかに簡単になります。

于 2010-11-07T11:33:21.480 に答える
1

フォーカスを外さずにイベントを処理することはできますか? もちろんそうだ!:)

あなたの要件に対する私の理解が正しいと仮定して、これがどのように機能するかのサンプルを次に示します。

class ComboListener implements ItemListener {
    @Override
    public void itemStateChanged(ItemEvent e) {
        if (e.getStateChange() == ItemEvent.SELECTED) {
            System.out.println("Selected Item: \""
                + ((JComboBox)e.getSource()).getSelectedItem() + "\"");
        }
    } 
}

if チェックを追加しない場合、選択されていない最初の項目と選択されている 2 番目の項目の両方に対してアクションを実行することになります。

于 2010-11-07T11:51:43.403 に答える
1

Choice で同様の状況に遭遇しました。私にとっては、Java のバグの方が好きです。私の場合、A と B の 2 つの選択肢があります。B は A の選択に依存します。たとえば、A={a1, a2, a3} です。A=a1 の場合、B は {1, 2, 3} の Choice リストです。A=a2 の場合、B は {4,5,6} のリストです。A=a3 の場合、B は {7,8,9} のリストです。フローは a1 を選択し、B で 2 を選択します。a2 を選択し、B はデフォルトのインデックス 0 (4) にあり、B で 5 を選択すると、itemStateChanged() 関数は呼び出されません。ビュー コントロールがそれに設定されたデータと同期していないようです。5 には前の選択と同じインデックスがあるため、itemStateChanged() が呼び出されない理由。

于 2012-10-02T15:33:06.347 に答える
1

あなたが説明したとおりに動作するはずです。以下は問題なく実行されます。

class Frame extends JFrame {
    JComboBox  box;
    JTextField field;
    String[]   entries = { "one", "two", "three" };

    Frame() {
        setLayout(new FlowLayout());

        box = new JComboBox(entries);
        box.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    field.setText((String) box.getSelectedItem());
                }
            }
        });
        add(box);

        field = new JTextField();
        field.setColumns(10);
        add(field);

        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
}

public class Test {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Frame frame = new Frame();
            }
        });

    }
}
于 2010-11-07T12:12:00.447 に答える