Java 创建JOptionPane时,如何将焦点设置在JOptionPane内的特定JTextfield上?
我想将焦点设置在一个特定的JTextField上,该字段作为对象消息传递给JOptionPane。这是我的代码(我希望重点放在txt2上,但重点始终放在txt1上):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
为什么不为此使用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);
});