java JTextField.requestFocus()在向GUI添加按钮后停止工作

k0pti3hp  于 2022-12-21  发布在  Java
关注(0)|答案(3)|浏览(103)

我用javax.swing和java.awt做了一个图形用户界面,请求焦点是用来保持文本字段的焦点,这样用户就可以从键盘开始了。然后我为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);
            }
        });

文本字段代码

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

zkure5ic1#

txtGuess.requestFocus();

首先,你不应该使用那个方法。阅读该方法的API,它会告诉你使用哪个方法更好。
我怎样才能修正这个问题,并在每次窗口打开时都将焦点放在文本字段上?
默认情况下,焦点应该在框架左上角的组件上,如果没有出现这种情况,那么你做的事情很奇怪。
如果您的文本字段不是框架上的第一个组件,则只能在GUI变为可见之后才能将焦点设置在它上面。
根据发布的代码,它看起来像是文本字段位于按钮的上方,所以它应该得到关注。也许问题是你使用了一个空布局和你添加组件到框架的顺序。如果没有一个适当的MCVE,我们无法判断。
对您的代码的其他建议:
1.不要使用null布局和setBounds()。您不应该手动设置大小/ Swing是设计用于布局管理器的。
1.不需要为每个按钮创建唯一的ActionListener。您可以创建一个通用侦听器供每个按钮共享。查看:如何在java中为jbutton添加快捷键?是此方法的一个工作示例。
我正在尝试找出如何创建MCVE版本来演示该问题
这并不是一个大谜团。你说你有一个带有文本字段的框架,它工作。然后你添加了一个按钮,它不工作。所以MCVE将简单地由一个带有文本字段和按钮的框架组成。游戏逻辑与你的问题无关,所以它是不需要的。所以MCVE应该是大约10 - 15行代码。

atmip9wb

atmip9wb2#

解决方案是实现这段代码

frame.addWindowFocusListener(new WindowAdapter() {
            public void windowGainedFocus(WindowEvent e) {
                textfield.requestFocusInWindow();
            }
        });
dtcbnfnu

dtcbnfnu3#

默认情况下,焦点位于布局中的第一个可聚焦组件。
如果要改变此行为:

  • 或者遵循accepted answer
  • 或在要获得焦点的组件上添加AncestorListener
  • 或者在框架/对话框上调用pack(),请求焦点textfield.requestFocusInWindow();,然后显示框架/对话框frame.setVisible(true);

请看这个other question,它已经在SO上得到了回答,以及this article,它给了你完整的答案。

相关问题