首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FocusListener行为

FocusListener行为
EN

Stack Overflow用户
提问于 2012-09-03 10:38:44
回答 1查看 2.6K关注 0票数 3

我有一个JFrame,当用户单击它时,我希望将其关闭。我有两个JTextFields和一个提交(用户名、密码、JButton )。当我给他们所有的FocusListener时,只要用户从一个字段转到另一个字段,窗口就会关闭。如何才能允许用户从一个字段转到另一个字段,并仅在用户单击弹出窗口之外的任何位置时才将其关闭?

代码语言:javascript
复制
public class LoginForm {

    static JTextField userName;
    static JTextField password;
    static JButton submit;
    JFrame main;
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();

    UserSession session;

    public LoginForm(){

        Handler handle = new Handler();  //inner class
        LoginFormFocusListener fl = new LoginFormFocusListener();   //inner class

        main = new JFrame("Please Login");

        main.setUndecorated(true);
        main.setBounds((dim.width/2) - (500/2),(dim.height/2) - (150/2),500,150);
        main.setVisible(true);
        main.setAlwaysOnTop(true);
        main.setResizable(false);
        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        userName = new JTextField(10);
        password = new JTextField(10);
        main.setLayout(new GridLayout(0,1));

        JPanel panel = new JPanel();
        main.add(panel);
        panel.add(new JLabel("Username: "));
        panel.add(userName);
        panel.add(new JLabel("Password: "));
        panel.add(password);

        submit = new JButton("Submit");
        panel.add(submit);

        userName.addFocusListener(fl);
        password.addFocusListener(fl);
        submit.addFocusListener(fl);

        submit.addActionListener(handle);
    }
}

..。(忽略不重要的方法和"Handler“类)

代码语言:javascript
复制
public class LoginFormFocusListener implements FocusListener{

    public void focusGained(FocusEvent fe) {
        System.out.println("focus gained...");
        System.out.println("click off of this window to close...");
    }

    public void focusLost(FocusEvent fe){
    System.out.println("focus lost...");
    WindowEvent winEvt = new WindowEvent(main, 0);
    winEvt.getWindow().dispose();
    }

}



//test
public static void main(String args[]){
    SwingUtilities.invokeLater(new Runnable(){  
        public void run(){  
        new LoginForm();  
    }  
    });  
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-03 10:52:09

不要为此使用FocusListener,因为它们是用于获得和失去焦点的组件,而不是用于顶级窗口。也许使用WindowListener监听窗口是停用的或图标化的。

例如:

代码语言:javascript
复制
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class WindowListenerFun {
   public static void main(String[] args) {
      JPanel panel = new JPanel();
      panel.add(new JTextField(10));
      panel.add(new JButton("button"));
      JFrame frame = new JFrame("Bad Frame");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.add(panel);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);

      frame.addWindowListener(new WindowAdapter() {

         @Override
         public void windowIconified(WindowEvent wEvt) {
            ((JFrame)wEvt.getSource()).dispose();
         }

         @Override
         public void windowDeactivated(WindowEvent wEvt) {
            ((JFrame)wEvt.getSource()).dispose();
         }

      });
   }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12241389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档