- - PR -
コンボボックスのアクションリスナー
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2003-12-06 06:53
JComboboxを編集可能にしてアクションリスナーに設定したのですが、
アイテムをリストから選ん場合は1回だけイベントを通知するのですが、ボックス内で値を書いてENTERキーで確定した場合はなぜか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 ActionListener { 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.setEditable(true); //編集可能 ch.setFont(f1); ch.addItem("1"); ch.addItem("2"); ch.addItem("3"); ch.addItem("4"); ch.addItem("5"); pn1.add(ch); ch.addActionListener(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 actionPerformed(ActionEvent e) { if(e.getSource()==ch){ System.out.println(ch.getSelectedItem().toString()); } } class WinEnd extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } } | ||||
|
投稿日時: 2003-12-06 10:50
値を書き換えた場合は、
comboBoxChanged - マウスで項目を選択したり、値を書き換えたとき comboBoxEdited - リターンキーを押したとき の2つのイベントがあがるようです。
下記のページを参照してください。 http://javaalmanac.com/egs/javax.swing/combobox_CbActionEvt.html " TARGET="_blank"> http://javaalmanac.com/egs/javax.swing/combobox_CbActionEvt.html なんか、BBコードがおかしいです??? 2つめのリンクをクリックしてください。 [ メッセージ編集済み 編集者: プリンス 編集日時 2003-12-06 10:53 ] [ メッセージ編集済み 編集者: プリンス 編集日時 2003-12-06 10:58 ] | ||||
|
投稿日時: 2003-12-06 10:54
ActionListenerであれば、多分、イベントが発生するたびに発生してしまうのでは??Enterキーもひとつのイベントになっているような気がします。
ただ、単に表示したくないのであれば、場合分けかな?下記のコード参考になれば・・・。応用すれば、多分やりたいことは下記が参考になるような気がします。 (違っていたら、すいません・・・) public void actionPerformed(ActionEvent e) { String com1 = e.getActionCommand(); if(e.getSource()==ch && !(com1.equals("comboBoxEdited"))){ System.out.println(ch.getSelectedItem().toString()); } } | ||||
|
投稿日時: 2003-12-06 12:54
ActionCommand, "comboBoxChanged"や"comboBoxEdited"で場合分けするのがよさそうなのですが、これらの文字列は、JComboBoxの実装の詳細であり、書きかえられた場合(普通書き換えないとは思うが...)、不可解なバグに悩まされてしまう可能性があります。また、これらの文字列に対する、外部からアクセスできる定数も定義されていません。実装に依存するのはシャクなので、以下のような代替案を考えてみました。
少なくとも、2回目、または同じアイテムの選択をスキップすることは可能です。 [ メッセージ編集済み 編集者: かずくん 編集日時 2003-12-06 12:56 ] | ||||
|
投稿日時: 2003-12-06 18:40
皆さんのアドバイスを元に作成したところ、イベントを1回だけ取得するのに成功しました。どうもありがとうございます。
| ||||
1
