質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1014閲覧

コンボボックスで選ばれたものを正常に出力したい

raiboz1115

総合スコア4

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/07/22 13:11

編集2021/07/22 14:30

複数のコンボボックスから来た信号を選別し、表示させるコードを書いたのですが、ラベルを使ってパネルに書き込む方は正常なのですがコンソール出力の方だけなぜがそれぞれ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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/07/22 13:48 編集

改行が変になっているようですが…。 > コンソール出力の方だけなぜがそれぞれ2文づつ出力されて label のほうは例え 2 回書き込んでも上書きされるだけですから、判断付かないだけかと思います。 itemStateChanged メソッドはどのような時に呼ばれるでしょう。 (itemStateChanged でパラメータ e の表示をしてみると分かり易いかと思います。)
raiboz1115

2021/07/22 14:46

itemStateChanged メソッドって戻り値intですよね? どちらのコンボボックスから信号を受け取ったかをitemStateChanged メソッドで判別できますか?
raiboz1115

2021/07/22 14:49

追記 改行のズレは直しました。
jimbe

2021/07/22 14:55 編集

ありがとうございます。 itemStateChanged の戻りは void ですが・・・表示のお勧めをしているのは > itemStateChanged(ItemEvent e) の ItemEvent 型の仮引数 e です。この中に itemStateChanged が呼ばれた意味が含まれていますので。詳細は java のドキュメントに書かれていると思います。 public void itemStateChanged(ItemEvent e) { System.out.println("itemStateChanged: ItemEvent="+e);     : といった具合ですね。 どのコンボボックスからかは、お使いの通り getItemSelectable で良いのではないでしょうか。
raiboz1115

2021/07/22 15:44

申し訳ありません、getStateChangeと勘違いしていました。 eを出力させて読んでみたところ、原因は初期設定されているコンボボックスの要素でも呼び出されているということであっていますでしょうか? コンボボックスの判別はgetItemSelectableでいいのですね、了解しました。
jimbe

2021/07/22 16:19 編集

e の中身やドキュメント等を参照されましたら、e の中に「選択(SELECTED)か、選択解除(DESELECTED)か」を示すデータがあることにお気付きになられましたでしょうか。 itemStateChanged というメソッド名を訳すと、「アイテムの状態が変わった」という風になりますね。 この場合のアイテムとは、コンボボックスに設定されている個々の選択肢のことです。(getSelectedItem の Item もその意味ですね。) コンボボックスは単一選択、つまり、複数の中で同時に一つしか選択出来ません。一つしか選択できないということは、別のものを選択したら、それまで選択していたものは選択解除される、ということです。 これが2回 itemStateChanged が呼ばれる理由です。
raiboz1115

2021/07/22 16:45

ありがとうございます、完璧に理解できました!
guest

回答1

0

ベストアンサー

JComboBox の選択が変わったら一回だけ通知を受ければ良い、ということでしたら、 JButton と同じく ActionListener が使えます。

投稿2021/07/22 16:25

jimbe

総合スコア13168

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問