2012-03-16 42 views
4

你能幫我解決這個問題嗎?我有一個JDialog與一些文本框,複選框和按鈕。我希望當框架不再聚焦時,消失。所以我給JDialog添加了一個焦點偵聽器,當焦點丟失時,我打電話給dialog.setVisible(false);。問題是,如果我點擊複選框,文本框或按鈕,框架就會失去焦點並消失。我怎麼才能保持專注,直到用戶點擊它的區域?Java保持框架集中

編輯:我所指的「框架」是一個JDialog。我不使用框架也不使用JFrame。所有組件都放置在JDialog上。我希望它在未聚焦時隱藏,但要保持聚焦狀態,直到用戶在其區域外單擊。

+0

爲了更好地幫助越早,張貼[SSCCE ](http://sscce.org/)。 – 2012-03-16 08:47:57

回答

5

好像你已經添加了錯誤的監聽器,你應該加入是addWindowFocusListener(...),看到這個小樣本程序,這是你要發生的事情:

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

public class DialogFocus 
{ 
    private JFrame frame; 
    private MyDialog myDialog; 

    public DialogFocus() 
    { 
    } 

    private void createAndDisplayGUI() 
    { 
     frame = new JFrame("JFRAME"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationByPlatform(true); 

     myDialog = new MyDialog(frame, "My Dialog", false); 

     JButton showButton = new JButton("SHOW DIALOG"); 
     showButton.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent ae) 
      { 
       if (!(myDialog.isShowing())) 
        myDialog.setVisible(true); 
      } 
     }); 

     frame.add(showButton, BorderLayout.PAGE_END); 

     frame.setSize(300, 300); 
     frame.setVisible(true); 
    } 

    public static void main(String\u005B\u005D args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new DialogFocus().createAndDisplayGUI(); 
      } 
     }); 
    } 
} 

class MyDialog extends JDialog 
{ 
    private WindowFocusListener windowFocusListener; 

    public MyDialog(JFrame frame, String title, boolean isModal) 
    { 
     setTitle(title); 
     setModal(isModal); 

     JPanel contentPane = new JPanel(); 

     JTextField tfield = new JTextField(10); 
     JComboBox cbox = new JComboBox(); 
     cbox.addItem("One"); 
     cbox.addItem("Two"); 
     cbox.addItem("Three"); 

     contentPane.add(tfield); 
     contentPane.add(cbox); 

     windowFocusListener = new WindowFocusListener() 
     { 
      public void windowGainedFocus(WindowEvent we) 
      { 
      } 

      public void windowLostFocus(WindowEvent we) 
      { 
       setVisible(false); 
      } 
     }; 

     addWindowFocusListener(windowFocusListener); 

     add(contentPane); 
     pack(); 
    } 
} 
+1

非常感謝!現在一切正常! – Teo 2012-03-16 09:02:56

+0

@Theo。 :呵呵,你的歡迎和保持微笑:-) – 2012-03-16 09:04:12

2

使對話框模態,然後用戶不能點擊框架。

+0

如果我使它成爲模態,那麼焦點偵聽器將無法工作。請參閱我的編輯。 – Teo 2012-03-16 08:40:59

2

檢查FocusEvent 它有public Component getOppositeComponent()。如果相反的組件是JDialog的子組件,則不要隱藏該對話框。