2012-11-17 56 views
2

我在這裏有一個相當基本的JFrame,當用戶在外面點擊時我想讓窗口自動關閉。當用戶在外面點擊時是否可以關閉窗口(通過某種方式檢測窗口外的點擊?)。在外部點擊時自動關閉JFrame窗口

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class ExampleJFrame { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("How can I make this window close when I click outside it?"); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 
     JLabel jlbempty = new JLabel(""); 
     jlbempty.setPreferredSize(new Dimension(200, 200)); 
     frame.getContentPane().add(jlbempty, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+1

我希望這是與我的問題有關:http://stackoverflow.com/questions/5717716/detecting-focus-on-frame-components-in-swing –

+0

其實這個問題包含你需要的確切答案.. –

+0

這不適用於所有情況,但是一旦它失去焦點,您可以關閉相框。 – Aaron

回答

6

檢測幀外的點擊很困難,因爲它可以是任何其他Java無法訪問的應用程序的點擊。

你可以用FocusListener嘗試如下圖所示

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.WindowConstants; 
import java.awt.event.FocusEvent; 
import java.awt.event.FocusListener; 

public class AutoCloseFrameDemo { 
    public static void main(String[] args) { 
    final JFrame frame = new JFrame("Test"); 
    frame.addFocusListener(new FocusListener() { 
     private boolean gained = false; 
     @Override 
     public void focusGained(FocusEvent e) { 
     gained = true; 
     } 

     @Override 
     public void focusLost(FocusEvent e) { 
     if (gained){ 
      frame.dispose(); 
     } 
     } 
    }); 
    frame.add(new JLabel("testlabel")); 

    frame.pack(); 
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    } 
} 

這適用於這個簡單的用例。還不確定如果您將例如在框架中的JTextField和文本字段獲得焦點。如果這導致JFrame也失去焦點,那麼您的應用程序將毫無用處。

編輯

更多的位健壯的解決方案可能是給收聽者附加到KeyboardFocusManager

import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.WindowConstants; 
import java.awt.BorderLayout; 
import java.awt.KeyboardFocusManager; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyVetoException; 
import java.beans.VetoableChangeListener; 

public class AutoCloseFrameDemo { 
    public static void main(String[] args) { 
    final JFrame frame = new JFrame("Test"); 

    KeyboardFocusManager.getCurrentKeyboardFocusManager(). 
     addVetoableChangeListener("focusedWindow", 
            new VetoableChangeListener() { 
            private boolean gained = false; 

            @Override 
            public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException { 
             if (evt.getNewValue() == frame) { 
             gained = true; 
             } 
             if (gained && evt.getNewValue() != frame) { 
             frame.dispose(); 
             } 
            } 
            }); 

    frame.add(new JTextField(10), BorderLayout.NORTH); 
    frame.add(new JTextField(10), BorderLayout.SOUTH); 

    frame.pack(); 
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    } 
} 

這允許在幀中的不同的文本字段之間切換焦點。

+1

你可以使用WindowListener#windowDeactivated或WindowFocusListener#windowLostFocus – MadProgrammer

+0

@MadProgrammer是的,其次,但你必須小心所擁有的JDialog(因爲你必須使用FocusListener)。 –

相關問題