0

JButton イベントを学習しようとしているときに、問題が発生して混乱しています。私が使用しているサンプルコードはこちらです。

コードは以下のとおりです。

jb.addChangeListener(new ChangeListener() 
{
    @Override
    public void stateChanged(ChangeEvent e)
    {
        System.out.println("Changed");
    }
});

これはデモ アプリケーションであるため、1 つのボタンのみが使用され、アプリケーションの起動時にフォーカスがあります。スペースバーを押すだけで、クリック イベントをシミュレートできます。チュートリアル (OReilly: Java Swing による) に従って、変更イベントを 2 回発生させ、その後にアクション イベントを発生させ、その後にアクション イベントを発生させる必要があります。すなわち

  1. かわった
  2. かわった
  3. アクションイベント
  4. かわった

しかし、4 回目のイベントの後、別の ChangeEvent を受け取りました。上記の方法で、実際には 1 回のクリックに対して 5 つのイベントがあります。マウスでクリックしようとすると、結果はさらに異なります。マウスがボタン領域に入ると、イベントが発生しました。

どのような変更が発生するのかわかりません。マウスが JButton の上に置かれると、ChangeEvent が発生します。そのボタンでどの状態が変化したかを知るための JButton の getChangedState (ItemStageChanged) のような同様のメソッドは見つかりません。学習なので、この問題が分からない限り ActionListener は使いたくありません。

だから私の質問は:

  1. ChangeEvent が 1 つであるはずの場所に 2 回表示されるのはなぜですか?
  2. JButtonで変更された状態を見つけるにはどうすればよいですか?

編集: DefaultButtonModel で言及されている 5 つの状態があり、それらは ButtonModel インターフェイスで定義されています。しかし、JButton には、それらの状態を取得するためのフィールドやメソッドがありません。彼らは喜んで無視されましたか?または、JButton(および AbstractButton) は ButtonModel インターフェイスとは関係ありません。

編集2:チュートリアルは、

L&F によっては、追加の ChangeEvents も存在する場合があります。

Windows で Swing のデフォルトの L&F を使用していますが、チュートリアルの予想とは異なる結果が得られます。

4

1 に答える 1

2

ボタンを押したときに発生する 5 つのイベントは次のとおりです。 ChangeEvent: Armed - true ChangeEvent: Pressed - true ActionEvent ChangeEvent: Pressed - false ChangeEvent: Armed - false

マウスを使用してボタンを押すと、上記に加えて、マウスがボタンの上に移動すると Rollover: true の ChangeEvent が発生し、マウスがボタンから離れると Rollever: false の ChangeEvent が発生します。

于 2015-01-21T21:41:02.963 に答える