首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法停止JTextFeild获取默认焦点

问无法停止JTextFeild获取默认焦点
EN

Stack Overflow用户
提问于 2016-09-02 08:34:19
回答 1查看 35关注 0票数 0

我有一个简单的登录屏幕。我希望UserName和Password显示在第一个和第二个文本字段中,直到它们被单击。此功能正在运行。然而,当应用程序启动时,第一个文本字段始终是焦点,因此显示为"“,直到失去焦点。我试图设置一个默认按钮并请求焦点,但无济于事。该按钮看起来默认正确,但由于某种原因,它没有接收到焦点。有人知道怎么解决这个问题吗?

代码语言:javascript
复制
public class Basics implements ActionListener{

private JFrame frmBasics;
private JTextField userNameFeild;
private JTextField passwordFeild;
private JButton btnSignIn;
private JButton btnSignUp;

/**
 * Launch the application.
 */
public static void main(String[] args) {



    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Basics window = new Basics();
                window.frmBasics.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });


}//end main

/**
 * Create the application.
 */
public Basics() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frmBasics = new JFrame();
    frmBasics.setTitle("Welcome to the POOPalace!!!");
    frmBasics.setBounds(100, 100, 511, 344);
    frmBasics.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frmBasics.getContentPane().setLayout(null);

    userNameFeild = new JTextField("UserName");
    userNameFeild.setBounds(148, 79, 214, 20);
    userNameFeild.addFocusListener(new FocusedClass());
    frmBasics.getContentPane().add(userNameFeild);
    userNameFeild.setColumns(10);

    passwordFeild = new JTextField("Password");
    passwordFeild.setBounds(148, 126, 214, 20);
    passwordFeild.addFocusListener(new FocusedClass());
    frmBasics.getContentPane().add(passwordFeild);
    passwordFeild.setColumns(10);

    btnSignIn = new JButton("Sign In");
    btnSignIn.setBounds(148, 182, 89, 23);
    btnSignIn.addActionListener(this);
    frmBasics.getContentPane().add(btnSignIn);

    btnSignUp = new JButton("Sign Up");
    btnSignUp.setBounds(273, 182, 89, 23);
    btnSignUp.addActionListener(this);
    frmBasics.getContentPane().add(btnSignUp);

    //from what I've been reading these 2 lines should be the solution
    //but the request focus seems to not be working 
    frmBasics.getRootPane().setDefaultButton(btnSignIn);;
    btnSignIn.requestFocus();


}

@Override
public void actionPerformed(ActionEvent e) {

    //frmBasics.getContentPane().removeAll();
    //frmBasics.repaint();
    System.out.println(userNameFeild.getText());
    System.out.println(passwordFeild.getText());

}//actionPerformed


private class FocusedClass implements FocusListener {

    @Override
    public void focusGained(FocusEvent arg0) {

        if(arg0.getSource().equals(userNameFeild) && userNameFeild.getText().compareTo("UserName") == 0){
            userNameFeild.setText("");
            }
        if(arg0.getSource().equals(passwordFeild) && passwordFeild.getText().compareTo("Password") == 0){
            passwordFeild.setText("");
        }

    }

    @Override
    public void focusLost(FocusEvent arg0) {

        if(userNameFeild.getText().compareTo("") == 0){
            userNameFeild.setText("UserName");
        }

        if(passwordFeild.getText().compareTo("") == 0){
            passwordFeild.setText("Password");
        }

        frmBasics.getContentPane().repaint();
    }

}



}//class
EN

回答 1

Stack Overflow用户

发布于 2016-09-03 22:10:58

只有在窗口布局完成后,请求焦点才起作用。我们需要在以下三种特定情况之一调用requestFocusInWindow():

windowOpened()方法中的

  1. 。EventQueue's invokeLater()中的
  2. ,它将在处理所有挂起事件后运行。重写的JFrame's setVisible()方法中的
  3. 。

第一个选项:

代码语言:javascript
复制
//btnSignIn.requestFocusInWindow();

frmBasics.addWindowListener(new WindowAdapter() {
    @Override
    public void windowOpened(WindowEvent e) {
        btnSignIn.requestFocusInWindow();
    }
});

还要注意的是,requestFocusInWindow()比requestFocus()更可移植。

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

https://stackoverflow.com/questions/39282718

复制
相关文章

相似问题

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