3

でアプリケーションを作成していますSwingが、問題が発生しました。focusLost()とイベントを処理したいのですがfocusGained()、コードにバグがあると思います。

私は次のテストコードを持っています:

addWindowFocusListener(new WindowFocusListener() {
    @Override
    public void windowLostFocus(WindowEvent e) {
        System.out.println("Lost!");
        System.out.println(e.toString());
    }

    @Override
    public void windowGainedFocus(WindowEvent e) {
        System.out.println("Gained!");
        System.out.println(e.toString());
    }
});

そして、ウィンドウをアクティブにすると、アプリは一度に2つのイベントを処理するようです:

得た!
frame0のjava.awt.event.WindowEvent[WINDOW_GAINED_FOCUS、opposite = null、oldState = 0、newState = 0]
失った!
frame0のjava.awt.event.WindowEvent[WINDOW_LOST_FOCUS、opposite = null、oldState = 0、newState = 0]

そして、ウィンドウを非アクティブ化すると、プログラムは何も出力しません。

もっと面白いこともあります。JFrameアプリに属する​​新しいアプリを開くと、この2番目を閉じても、イベントシステムは正しく機能しますWindow

なぜそれが起こっているのか分かりません。助けてください。

システム仕様:

  • OS:Ubuntu 12.04 x86_64
  • JVM:OpenJDK 7
m4tx @ m4tx-EP35-DS4:〜$ java -version
ピックアップした_JAVA_OPTIONS:-Dawt.useSystemAAFontSettings = lcd
Javaバージョン「1.7.0_03」
OpenJDKランタイム環境(IcedTea7 2.1.1pre)(7〜u3-2.1.1〜pre1-1ubuntu3)
OpenJDK 64ビットサーバーVM(ビルド22.0-b10、混合モード)
4

1 に答える 1

4

ええと、私はあなたのコードに多くの間違いを見ることができません。簡単なデモをまとめましたが、うまく機能しているようです。

import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class WindowEventDemo extends JFrame implements WindowFocusListener {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new WindowEventDemo("Window Event Demo").setVisible(true);
            }
        });
    }

    public WindowEventDemo(String name) {
        super(name);
        addWindowFocusListener(this);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 300);
    }

    @Override
    public void windowGainedFocus(WindowEvent e) {
        System.out.println("WindowFocusListener method called: windowGainedFocus.");
    }

    @Override
    public void windowLostFocus(WindowEvent e) {
        System.out.println("WindowFocusListener method called: windowLostFocus.");
    }
}

起動時に次のように出力されます。

WindowFocusListenerメソッドが呼び出されました:windowGainedFocus。

ウィンドウが最小化されたとき、またはマウスが画面上の他の場所でクリックされたときは、次のようになりますJFrame

WindowFocusListenerメソッドが呼び出されました:windowLostFocus。

于 2012-07-23T17:42:15.273 に答える