2012-03-16 65 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的子组件,则不要隐藏该对话框。