2016-09-02 7 views
0

私は簡単なログイン画面を持っています。ユーザー名とパスワードがクリックされるまで、最初と2番目のテキストフィールドに表示されるようにします。この機能は動作しています。しかし、最初のテキストフィールドはアプリの起動時に常にフォーカスされているため、フォーカスが失われるまでは ""と表示されます。私は、デフォルトのボタンを設定し、フォーカスを要求して無駄にしようとしました。ボタンがデフォルトで正しく表示されているように見えますが、何らかの理由でフォーカスが届きません。誰でもこれを修正する方法を知っていますか?JTextFeildがデフォルトのフォーカスを取得しないようにする

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 
+1

Java GUIは、異なるロケールの異なるPLAFを使用して、異なるOS、画面サイズ、画面解像度などで動作する必要があります。したがって、ピクセルの完全なレイアウトには役立ちません。代わりに、レイアウトマネージャや[それらの組み合わせ](http://stackoverflow.com/a/5630271/418556)と[空白](http://stackoverflow.com/a/17874718/)のレイアウトパディングとボーダーを使用してください。 418556)。 –

+0

ありがとうございます@AndrewThompson – user3590350

+0

あなたは問題を解決しましたか?もっと早く助けを求めるには、[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。 –

答えて

1

要求は、ウィンドウのレイアウトが完了した後にのみ機能します。

  1. windowOpened()方法で: 私たちは、3つの特定の状況のいずれかにrequestFocusInWindow()を呼び出す必要があります。
  2. EventQueue's invokeLater()では、すべての保留中のイベントが処理された後に実行されます。
  3. オーバーライド中JFrame'ssetVisible()メソッド。

最初のオプション:

//btnSignIn.requestFocusInWindow(); 

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

requestFocusInWindow()requestFocus()よりもポータブルであることに注意してください。

関連する問題