- PR -

コンボボックスのアクションリスナー

1
投稿者投稿内容
ケンジ
会議室デビュー日: 2003/12/04
投稿数: 7
お住まい・勤務地: 川崎市川崎区
投稿日時: 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/07/05
投稿数: 78
お住まい・勤務地: 神奈川
投稿日時: 2003-12-06 10:50
値を書き換えた場合は、
comboBoxChanged - マウスで項目を選択したり、値を書き換えたとき
comboBoxEdited - リターンキーを押したとき
の2つのイベントがあがるようです。
コード:

if ("comboBoxEdited".equals(evt.getActionCommand())) {
// User has typed in a string; only possible with an editable combobox
} else if ("comboBoxChanged".equals(evt.getActionCommand())) {
// User has selected an item; it may be the same item
}



下記のページを参照してください。
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 ]
begood
ベテラン
会議室デビュー日: 2003/09/12
投稿数: 97
お住まい・勤務地: とうきょー
投稿日時: 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/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-12-06 12:54
ActionCommand, "comboBoxChanged"や"comboBoxEdited"で場合分けするのがよさそうなのですが、これらの文字列は、JComboBoxの実装の詳細であり、書きかえられた場合(普通書き換えないとは思うが...)、不可解なバグに悩まされてしまう可能性があります。また、これらの文字列に対する、外部からアクセスできる定数も定義されていません。実装に依存するのはシャクなので、以下のような代替案を考えてみました。
コード:

private Object selItem;

public void actionPerformed(ActionEvent e) {
if(e.getSource()==ch){
Object sel = ch.getSelectedItem();

if (sel != null && ! sel.equals(selItem)
|| sel == null && selItem != null)
{
selItem = sel;
cb.addItem(sel);
System.out.println(ch.getSelectedItem().toString());
}
}
}


少なくとも、2回目、または同じアイテムの選択をスキップすることは可能です。


[ メッセージ編集済み 編集者: かずくん 編集日時 2003-12-06 12:56 ]
ケンジ
会議室デビュー日: 2003/12/04
投稿数: 7
お住まい・勤務地: 川崎市川崎区
投稿日時: 2003-12-06 18:40
皆さんのアドバイスを元に作成したところ、イベントを1回だけ取得するのに成功しました。どうもありがとうございます。


1

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