如何在创建时将焦点设置在JOptionPane内的特定JTextfield上?

我想把焦点放在一个特定的JTextField上,它作为对象消息传递给JOptionPane。 这是我的代码(我希望专注于txt2但焦点始终在txt1上):

import java.awt.*; import java.util.*; import javax.swing.*; public class TextArea extends JPanel { private JTextArea txt1 = new JTextArea(); private JTextArea txt2 = new JTextArea(); public TextArea() { setLayout(null); setPreferredSize(new Dimension(200,100)); txt1.setBounds (20, 20, 220, 20); txt2.setBounds (20, 45, 220, 20); txt1.setText("Text Field #1"); txt2.setText("Text Field #2"); add(txt1); add(txt2); txt2.requestFocus(); } private void display() { Object[] options = {this}; JOptionPane pane = new JOptionPane(); pane.showOptionDialog(null, null, "Title", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, txt2); } public static void main(String[] args) { new TextArea().display(); } } 

通过覆盖addNotify可以让txt2组件在添加后请求焦点。 喜欢这个:

 private JTextArea txt2 = new JTextArea() { public void addNotify() { super.addNotify(); requestFocus(); } }; 

这是一个function齐全/经过测试的程序版本:

 import java.awt.Dimension; import javax.swing.*; public class Test extends JPanel { private JTextArea txt1 = new JTextArea(); private JTextArea txt2 = new JTextArea() { public void addNotify() { super.addNotify(); requestFocus(); } }; public Test() { setLayout(null); setPreferredSize(new Dimension(200, 100)); txt1.setBounds(20, 20, 220, 20); txt2.setBounds(20, 45, 220, 20); txt1.setText("Text Field #1"); txt2.setText("Text Field #2"); add(txt1); add(txt2); } private void display() { Object[] options = { this }; JOptionPane pane = new JOptionPane(); pane.showOptionDialog(null, null, "Title", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, txt2); } public static void main(String[] args) { new Test().display(); } } 

我在上一个问题中给出了答案(http://stackoverflow.com/questions/6475320/how-to-set-the-orientation-of-jtextarea-from-right-to-left-inside-joptionpane)。 这个概念是一样的。 考虑给出的解决方案并了解它的工作原理,以便您可以在不同的情况下应用它。

如果您仍然不理解该建议,请参阅DialogFocus以获取可重用的代码。

为什么不为此目的使用JDialog或JFrame?

  public void display2() { JDialog dialog = new JDialog(null, "Title", ModalityType.APPLICATION_MODAL); dialog.getContentPane().add(this); dialog.pack(); dialog.setLocationRelativeTo(null); txt2.requestFocusInWindow(); dialog.setVisible(true); }