我有一个使用javax.swing和java.awt创建的GUI,请求焦点正在努力保持文本字段的焦点,这样用户就可以从键盘开始。然后我为每个整数0-9添加了按钮,以及一个清除字段按钮。然而,焦点现在始终从一个按钮开始。
每当我点击一个按钮时,焦点仍然会返回到textField,或者如果我启动焦点,它仍然保留在textField中,如何解决这个问题并在每次窗口打开时将焦点放在文本字段上?
示例数字按钮
JButton btn0 = new JButton("0");
panel.add(btn0);
btn0.setBounds(50, 360, 50, 50);
btn0.setHorizontalAlignment(SwingConstants.CENTER);
btn0.setForeground(Color.BLACK);
btn0.setFont(new Font("Arial", Font.BOLD, 20));
btn0.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String userIn = txtGuess.getText() + btn0.getText();
txtGuess.setText(userIn);
}
});
textField代码
txtGuess = new JTextField();
txtGuess.setBounds(325, 220, 100, 35);
panel.add(txtGuess);
txtGuess.setFont(new Font("Arial", Font.BOLD, 25));
txtGuess.setHorizontalAlignment(SwingConstants.CENTER);
txtGuess.setBackground(Color.decode("#206BA4"));
txtGuess.setForeground(Color.decode("#EBF4FA"));
txtGuess.setBorder(loweredBorder);
txtGuess.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
checkGuess();
}
});
checkGuess();
的结尾finally {
txtGuess.requestFocus(); //sets focus to the text box after checking guess
txtGuess.selectAll(); //highlights all text in the text field so UX is improved
if (attempt >= 10) {
lblOutput.setText("You lose! Try Again?");
newGame();
}
答案 0 :(得分:1)
txtGuess.requestFocus();
首先,您不应该使用该方法。阅读该方法的API,它将告诉您更好的使用方法。
如何解决此问题,并在每次窗口打开时关注文本字段?
默认情况下,焦点应该转到框架左上角的组件。如果这没有发生,那么你正在做一些奇怪的事情。
如果您的文本字段不是框架上的第一个组件,那么您只能在GUI可见后设置焦点。
根据发布的代码,看起来文本字段位于按钮上方,因此应该获得焦点。也许问题在于您使用的是null布局以及向框架添加组件的顺序。没有合适的MCVE,我们无法说出来。
您的代码的其他建议:
不要使用null布局和setBounds()。您不应手动设置大小/ Swing旨在与布局管理器一起使用。
无需为每个按钮创建唯一的ActionListener。您可以创建一个通用侦听器以供每个按钮共享。查看:How to add a shortcut key for a jbutton in java?了解此方法的工作示例。
我试图找出如何创建MCVE版本来演示问题
这不是一个大谜。你声明你有一个带有文本字段的框架并且它有效。然后你添加了一个按钮,它没有工作。所以MCVE将只包含一个带有文本字段和按钮的框架。游戏逻辑与您的问题无关,因此不需要。所以MCVE应该是大约10到15行代码。
答案 1 :(得分:0)
解决方案是实现此代码
frame.addWindowFocusListener(new WindowAdapter() {
public void windowGainedFocus(WindowEvent e) {
textfield.requestFocusInWindow();
}
});