JButton イベントを学習しようとしているときに、問題が発生して混乱しています。私が使用しているサンプルコードはこちらです。
コードは以下のとおりです。
jb.addChangeListener(new ChangeListener()
{
@Override
public void stateChanged(ChangeEvent e)
{
System.out.println("Changed");
}
});
これはデモ アプリケーションであるため、1 つのボタンのみが使用され、アプリケーションの起動時にフォーカスがあります。スペースバーを押すだけで、クリック イベントをシミュレートできます。チュートリアル (OReilly: Java Swing による) に従って、変更イベントを 2 回発生させ、その後にアクション イベントを発生させ、その後にアクション イベントを発生させる必要があります。すなわち
- かわった
- かわった
- アクションイベント
- かわった
しかし、4 回目のイベントの後、別の ChangeEvent を受け取りました。上記の方法で、実際には 1 回のクリックに対して 5 つのイベントがあります。マウスでクリックしようとすると、結果はさらに異なります。マウスがボタン領域に入ると、イベントが発生しました。
どのような変更が発生するのかわかりません。マウスが JButton の上に置かれると、ChangeEvent が発生します。そのボタンでどの状態が変化したかを知るための JButton の getChangedState (ItemStageChanged) のような同様のメソッドは見つかりません。学習なので、この問題が分からない限り ActionListener は使いたくありません。
だから私の質問は:
- ChangeEvent が 1 つであるはずの場所に 2 回表示されるのはなぜですか?
- JButtonで変更された状態を見つけるにはどうすればよいですか?
編集: DefaultButtonModel で言及されている 5 つの状態があり、それらは ButtonModel インターフェイスで定義されています。しかし、JButton には、それらの状態を取得するためのフィールドやメソッドがありません。彼らは喜んで無視されましたか?または、JButton(および AbstractButton) は ButtonModel インターフェイスとは関係ありません。
編集2:チュートリアルは、
L&F によっては、追加の ChangeEvents も存在する場合があります。
Windows で Swing のデフォルトの L&F を使用していますが、チュートリアルの予想とは異なる結果が得られます。