【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集

jBuilder8にて、テストプログラムを作成しています。
アプレットに、ただ、単純にjCheckBoxをだけを作って、実行したところ、jCheckBox1_stateChanged()がcheckboxを1クリックにつき、5回実行されている。
(メッセージが5回表示される)
なぜでしょうか?
よろしくお願いいたします。
(ソースが見づらくすみません)

public class Applet1 extends Applet {
private boolean isStandalone = false;
JCheckBox jCheckBox1 = new JCheckBox();
int i = 0;
public Applet1() {
}

public void init() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
jCheckBox1.setText("jCheckBox1");
jCheckBox1.setBounds(new Rectangle(102, 77, 133, 23));
jCheckBox1.addChangeListener(new Applet1_jCheckBox1_changeAdapter(this));
this.setLayout(null);
this.add(jCheckBox1, null);
}

void jCheckBox1_stateChanged(ChangeEvent e) {
i++;
System.out.println("i = " + i);
}
}

class Applet1_jCheckBox1_changeAdapter implements javax.swing.event.ChangeListener {
Applet1 adaptee;
Applet1_jCheckBox1_changeAdapter(Applet1 adaptee) {
this.adaptee = adaptee;
}
public void stateChanged(ChangeEvent e) {
adaptee.jCheckBox1_stateChanged(e);
}
}

A 回答 (3件)

ごめんなさい。


なぜ、5回実行されるのかは、わかりません。

Swingにはよく、バグがあったりするようです。
JAVAのGUI周りはどうも、挙動不信なところをがあって、
バグもたくさんあります。
今回のがバグかどうかは知りません。
それなりに理由があるかもしれないですが・・。私にはわかりません。
googleで調べてもなかなか答えを見出せない時が多いですね。
J2EE関連のほうに比べて、知っている人が少ないのかもしれない・・。


とはいえ、
チェックボックス1回につき1回の実行にしたいのであれば
解決策はあります。
私がもし納期に迫られているのであれば、
以下の解決策をとります。


Applet1_jCheckBox1_changeAdapterクラスに
以下のコードを追加します。


(1)
private boolean previousState;

というフィールドをひとつ追加する。


(2)
stateChangedを変更する


(変更前)
public void stateChanged(ChangeEvent e) {
adaptee.jCheckBox1_stateChanged(e);
}


(変更後)
public void stateChanged(ChangeEvent e) {
boolean nowState = ( (JCheckBox)e.getSource() ).isSelected();

if( previousState == nowState ) {
return;
}

adaptee.jCheckBox1_stateChanged(e);

previousState = nowState;
}

以上。
これで、チェックボックスを1回押すごとに、1回だけ jCheckBox1_stateChanged(
が呼ばれます。

こんなので、回答になったでしょうか。
    • good
    • 0
この回答へのお礼

返答ありがとうございます。
自己解決できまして、イベントを
stateChangedではなく、itemStateChangedになおしたら、思ったとおりの動作をするようになりました。
丁寧な返答ほんとにありがとうございました。

お礼日時:2003/12/25 00:04

>jCheckBox1_stateChanged()がcheckboxを1クリックにつき、5回実行されている。


(メッセージが5回表示される)
なぜでしょうか?

まず間違いなく、
「ChangeEventが1クリックに付き5回、発生しているから」
でしょう。
    • good
    • 0

NO1です



>(1)
>private boolean previousState;

>というフィールドをひとつ追加する。

ですが、これの
previousStateの初期値は
jCheckBox1の初期と同じになるようにしといてくださいね。

private boolean previousState;

private boolean previousState = jCheckBox1.isSelected();

にするなり・・。そこらへんはうまくあわすという前提で・・

以上です。
    • good
    • 0
この回答へのお礼

返答ありがとうございます。
NO.1さんのお礼のところに書いたとおりです。
StateChangedの仕様はこれから調査したいと思っています。

お礼日時:2003/12/25 00:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報