- PR -

JComboboxについて

1
投稿者投稿内容
ケンジ
会議室デビュー日: 2003/12/04
投稿数: 7
お住まい・勤務地: 川崎市川崎区
投稿日時: 2003-12-04 20:14
はじめまして。
最近JAVAの勉強を始めたばかりの初心者です。
早速ですがJComboboxにItemListenerでイベントの処理を行おうとしたのですが、
コンボボックスを選択したときのリスナーがなぜか2回通知されてしまうのです。
どなたか解決策を教えていただけないでしょうか、よろしくお願いします。
コードはこんな感じです。

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;

public class AWT1 {
public static void main (String[] args)
{
Win win = new Win("Test Window", "Test Data");
}
}

class Win extends JFrame implements ItemListener {

JComboBox ch;

Win (String name, String data)
{

super(name);

Container cp = getContentPane();
cp.setLayout(new GridLayout(2, 1, 5, 10));

Font f1 = new Font("MS 明朝", Font.PLAIN, 20);

JPanel pn1 = new JPanel();
cp.add(pn1);

ch = new JComboBox();
ch.setFont(f1);
ch.addItem("1");
ch.addItem("2");
ch.addItem("3");
ch.addItem("4");
ch.addItem("5");
pn1.add(ch);
ch.addItemListener(this);

JPanel pn2 = new JPanel();
cp.add(pn2);

setSize(350, 400);

setVisible(true);

addWindowListener(new WinEnd());
}


public Insets getInsets()
{
return new Insets(35, 10, 10, 10);
}


public void itemStateChanged(ItemEvent e)
{
if (e.getItemSelectable() == ch) {
int k = ch.getSelectedIndex();
System.out.println("aaaa");

}
}

class WinEnd extends WindowAdapter
{
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
}

begood
ベテラン
会議室デビュー日: 2003/09/12
投稿数: 97
お住まい・勤務地: とうきょー
投稿日時: 2003-12-04 21:07
参考にならないと思われますが・・・
JAVAのAPIの仕様によると、1つか2つの、という仕様が記載されています。私もこの、または、というときが気にはなっています。ほかのItemListenerにはこのようなことはなかった気がしています。仕様の深い部分まではしらないので、なんともいえないのですが・・・。

(APIからの抜粋)
aListener will receive one or two ItemEvents when the selected item changes.

かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-12-04 21:59
開発環境のバージョンが明記されていないので分からないですが、
J2SE 1.4.2のソースコードをデバッガで追いかけると、ItemEventの受信はアイテムセレクトとアイテムデセレクトのときに行われています。これが、2回受信する原因でしょう。
JComboBoxはItemEventのほかにActionEventも受けるので、ActionListenerで1回だけの受信になると思います。または、ItemEvent#getStateChange()の返値がItemEvent.SELECTEDのときだけ処理するというのでも問題ないと思います。お好きな方をどうぞ。
1

スキルアップ/キャリアアップ(JOB@IT)