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

Java 创建JOptionPane时,如何将焦点设置在JOptionPane内的特定JTextfield上?,java,swing,jtextfield,setfocus,Java,Swing,Jtextfield,Setfocus,我想将焦点设置在一个特定的JTextField上,该字段作为对象消息传递给JOptionPane。这是我的代码(我希望重点放在txt2上,但重点始终放在txt1上): 为什么不为此使用JDialog或JFrame呢 public void display2() { JDialog dialog = new JDialog(null, "Title", ModalityType.APPLICATION_MODAL); dialog.getContentPane().a

我想将焦点设置在一个特定的JTextField上,该字段作为对象消息传递给JOptionPane。这是我的代码(我希望重点放在txt2上,但重点始终放在txt1上):


为什么不为此使用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);
   }

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


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

您可以通过覆盖
addNotify
使
txt2
组件请求在添加后聚焦。像这样:

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

以下是您的程序的完整功能/测试版本:

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();
    }
}

您可以使用中建议的解决方法

而不是

txt2.requestFocus();
使用


我修改了解决方案以使用Java8特性。对于较旧版本的Java,请参见。

我还没有见过这种类型的JOptionPane以这种方式使用,我也不确定这是否是正确的方法。为什么不使用JDialog呢?这种方法没有错。通过完全创建一个自定义对话框,它省去了重新发明轮子的麻烦。您只需要创建自定义面板。@camickr:Rob,我不得不表示不同意,因为如果您仔细查看他的代码,他将自己的JPanel添加到JOptionPane showOptionDialog方法的Object[]options变量(第7个参数)中,而不是对象变量(第二个变量)中,这似乎非常奇怪(至少对我来说)。你以前这样做过吗?我知道我没有。@Eng Fouad,我很失望你根据发布的代码采取了解决方案。它表明您只是复制解决方案,而不是花时间去理解给出的其他解决方案。我为您提供了一个简单的单线解决方案,您可以使用它而无需对组件进行子类化。可重用解决方案通常比定制解决方案更受欢迎。您不是通过复制解决方案来学习的,而是通过理解给出的建议来学习的。@Hovercraft&@camickr:对不起,伙计们,我只关心如何将焦点放在某些JTextField上,我快速编写了这个(SSCCE),您还将JPanel添加到JOptionPane showOptionDialog方法的options参数中。你觉得这不奇怪吗?同意。这可能不是实现对话框的最佳方式。将其视为一个快速的“最小”修复方法。+1这同样有效,但艾奥贝首先回答了这个问题,所以我接受他的答案。无论如何谢谢:)@Eng Fouad,你先说什么?我提前3分钟给出了答案!另外,我昨天也给了你这个概念。无论如何,答案应该根据可重用性和其他设计考虑来选择。你不能因为有人发布代码就接受答案。您需要花时间理解代码的含义,以便在其他情况下使用代码或其概念。
txt2.requestFocus();
txt2.addHierarchyListener(e -> {
    if(e.getComponent().isShowing() && (e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0)
        SwingUtilities.invokeLater(e.getComponent()::requestFocusInWindow);
});