2012-07-23 69 views
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個事件一次

 
Gained! 
java.awt.event.WindowEvent[WINDOW_GAINED_FOCUS,opposite=null,oldState=0,newState=0] on frame0 
Lost! 
java.awt.event.WindowEvent[WINDOW_LOST_FOCUS,opposite=null,oldState=0,newState=0] on frame0 

而且,當我停用窗口時,程序不會打印任何內容。

還有更有趣的事情。當我打開屬於我的應用程序的新的JFrame時,事件系統正常工作,即使當我關閉第二個Window時。

我只是不知道它爲什麼會發生。請幫忙。

系統規格:

  • OS:Ubuntu的12.04 x86_64的
  • JVM:OpenJDK 7的
 
[email protected]:~$ java -version 
Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=lcd 
java version "1.7.0_03" 
OpenJDK Runtime Environment (IcedTea7 2.1.1pre) (7~u3-2.1.1~pre1-1ubuntu3) 
OpenJDK 64-Bit Server VM (build 22.0-b10, mixed mode) 
+2

您可以發佈[短的,獨立的,正確的示例(SSCCE)(http://www.sscce.org/)演示您的問題(即一些可以運行爲是)? – assylias 2012-07-23 17:09:53

+0

請發佈代碼。由於我關於問題的政策,我通過給你一個投票來撤消了反對票。 – 2012-07-23 17:44:18

+0

在這一刻我不能......我爲自己寫了一個簡單的例子,但一切都好。一個應用程序,我有這個問題是一個大的應用程序,所以我不能在那裏上傳代碼。我認爲這個問題可能是由jMonkeyEngine(lwjgl)畫布造成的。如果我能編寫SSCCE,我會寫它... – m4tx 2012-07-23 18:07:43

回答

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。