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);
}
}
No.1ベストアンサー
- 回答日時:
ごめんなさい。
なぜ、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(
が呼ばれます。
こんなので、回答になったでしょうか。
返答ありがとうございます。
自己解決できまして、イベントを
stateChangedではなく、itemStateChangedになおしたら、思ったとおりの動作をするようになりました。
丁寧な返答ほんとにありがとうございました。
No.3
- 回答日時:
>jCheckBox1_stateChanged()がcheckboxを1クリックにつき、5回実行されている。
(メッセージが5回表示される)
なぜでしょうか?
まず間違いなく、
「ChangeEventが1クリックに付き5回、発生しているから」
でしょう。
No.2
- 回答日時:
NO1です
>(1)
>private boolean previousState;
>というフィールドをひとつ追加する。
ですが、これの
previousStateの初期値は
jCheckBox1の初期と同じになるようにしといてくださいね。
private boolean previousState;
を
private boolean previousState = jCheckBox1.isSelected();
にするなり・・。そこらへんはうまくあわすという前提で・・
以上です。
返答ありがとうございます。
NO.1さんのお礼のところに書いたとおりです。
StateChangedの仕様はこれから調査したいと思っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ボタンのイベントで異なるウィ...
-
C#でのWNetAddConnection3の使...
-
Junitテストでvoid戻り値メッソ...
-
大量のデータを読み込んで表示...
-
C#で別のFormへ複数の値を返そ...
-
【Java】画像表示が出来ない!
-
[C#.net]スレッド化された別フ...
-
シリアル通信で受信したデータ...
-
JavaプログラムのUML化
-
C#でキーイベントが発生しない...
-
C# 矢印キーの取得
-
Graphicsクラスを使って描画履...
-
C# MouseHoverを何度も呼ぶには
-
Java配列でNullPointerExceptio...
-
Path型をString型へ変換する(Java)
-
JSPやサーブレットでSystem.out...
-
オブジェクトの中のプロパティ...
-
csvファイルを2次元配列に格納
-
ダブルクォーテーションのrepla...
-
System.err. printlnとSystem.o...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C#で、あるクラスのメンバーす...
-
C#でのWNetAddConnection3の使...
-
Junitテストでvoid戻り値メッソ...
-
ボタンの複数割り当てについて
-
C# DataGridView列カスタマイズ
-
C# WinForm のDataGridView Cel...
-
C# visibleプロパティをfalseに...
-
[C#.net]スレッド化された別フ...
-
C# 矢印キーの取得
-
unityでのC++エラーの原因がわ...
-
C#から、C++で作成したdll内の...
-
コンボボックスを使う時の警告
-
JavaFXでの表内のチェックボッ...
-
C#で別のFormへ複数の値を返そ...
-
vc++ 2005 Pictureboxの透過処理
-
プログラミング(Java)じゃん...
-
C#でキーイベントが発生しない...
-
正規表現
-
C# MouseHoverを何度も呼ぶには
おすすめ情報