複数のコンボボックスから来た信号を選別し、表示させるコードを書いたのですが、ラベルを使ってパネルに書き込む方は正常なのですがコンソール出力の方だけなぜがそれぞれ2文づつ出力されてしまいます。対処法を教えていただきたいです。
Java
1import java.awt.BorderLayout; 2import java.awt.event.ItemEvent; 3import java.awt.event.ItemListener; 4 5import javax.swing.JComboBox; 6import javax.swing.JFrame; 7import javax.swing.JLabel; 8import javax.swing.JPanel; 9 10public class Ctest extends JFrame implements ItemListener { 11 String[] combodata = { "Swing", "Java2D", "Java3D", "JavaMail" }; 12 String[] combodata2 = { "A", "B", "C", "D" }; 13 JComboBox combo1 = new JComboBox(combodata); 14 JComboBox combo2 = new JComboBox(combodata2); 15 JLabel label; 16 17 public static void main(String[] args) { 18 Ctest frame = new Ctest(); 19 20 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 21 frame.setBounds(10, 10, 300, 200); 22 frame.setTitle("タイトル"); 23 frame.setVisible(true); 24 } 25 26 Ctest() { 27 combo1.addItemListener(this); 28 combo2.addItemListener(this); 29 JPanel p = new JPanel(); 30 p.add(combo1); 31 p.add(combo2); 32 33 label = new JLabel(); 34 35 JPanel labelPanel = new JPanel(); 36 labelPanel.add(label); 37 38 getContentPane().add(p, BorderLayout.CENTER); 39 getContentPane().add(labelPanel, BorderLayout.PAGE_END); 40 } 41 42 public void itemStateChanged(ItemEvent e) { 43 if (e.getItemSelectable() == combo1) { 44 String data = "combo1から" + (String) combo1.getSelectedItem() + "が選ばれた"; 45 label.setText(data); 46 System.out.println("combo1から" + (String) combo1.getSelectedItem() + "が選ばれた"); 47 } else if (e.getItemSelectable() == combo2) { 48 String data = "combo2から" + (String) combo2.getSelectedItem() + "が選ばれた"; 49 label.setText(data); 50 System.out.println("combo2から" + (String) combo2.getSelectedItem() + "が選ばれた"); 51 } 52 } 53}
改行が変になっているようですが…。
> コンソール出力の方だけなぜがそれぞれ2文づつ出力されて
label のほうは例え 2 回書き込んでも上書きされるだけですから、判断付かないだけかと思います。
itemStateChanged メソッドはどのような時に呼ばれるでしょう。
(itemStateChanged でパラメータ e の表示をしてみると分かり易いかと思います。)
itemStateChanged メソッドって戻り値intですよね?
どちらのコンボボックスから信号を受け取ったかをitemStateChanged メソッドで判別できますか?
追記
改行のズレは直しました。
ありがとうございます。
itemStateChanged の戻りは void ですが・・・表示のお勧めをしているのは
> itemStateChanged(ItemEvent e)
の ItemEvent 型の仮引数 e です。この中に itemStateChanged が呼ばれた意味が含まれていますので。詳細は java のドキュメントに書かれていると思います。
public void itemStateChanged(ItemEvent e) {
System.out.println("itemStateChanged: ItemEvent="+e);
:
といった具合ですね。
どのコンボボックスからかは、お使いの通り getItemSelectable で良いのではないでしょうか。
申し訳ありません、getStateChangeと勘違いしていました。
eを出力させて読んでみたところ、原因は初期設定されているコンボボックスの要素でも呼び出されているということであっていますでしょうか?
コンボボックスの判別はgetItemSelectableでいいのですね、了解しました。
e の中身やドキュメント等を参照されましたら、e の中に「選択(SELECTED)か、選択解除(DESELECTED)か」を示すデータがあることにお気付きになられましたでしょうか。
itemStateChanged というメソッド名を訳すと、「アイテムの状態が変わった」という風になりますね。
この場合のアイテムとは、コンボボックスに設定されている個々の選択肢のことです。(getSelectedItem の Item もその意味ですね。)
コンボボックスは単一選択、つまり、複数の中で同時に一つしか選択出来ません。一つしか選択できないということは、別のものを選択したら、それまで選択していたものは選択解除される、ということです。
これが2回 itemStateChanged が呼ばれる理由です。
ありがとうございます、完璧に理解できました!
回答1件
あなたの回答
tips
プレビュー