当前位置: 首页 > 知识库问答 >
问题:

JTextField。将按钮添加到GUI后,requestFocus()停止工作

邢洋
2023-03-14

我有一个使用javax.swing和java.awt的图形用户界面,请求焦点是保持文本字段的焦点,这样用户就可以从键盘开始。然后,我为每个整数0-9添加了按钮,以及一个清晰的字段按钮。然而,现在的焦点总是从按钮开始。

当我单击一个按钮时,焦点仍然返回到文本字段,或者如果我启动焦点,它仍然保留在文本字段中,我如何解决这个问题,并在每次窗口打开时将焦点放在文本字段上?

数字按钮示例

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

检查的结束,猜猜看();

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

共有2个答案

巴星华
2023-03-14

解决方案是实现这个代码

frame.addWindowFocusListener(new WindowAdapter() {
            public void windowGainedFocus(WindowEvent e) {
                textfield.requestFocusInWindow();
            }
        });
奚卓
2023-03-14
txtGuess.requestFocus(); 

首先,你不应该使用这种方法。阅读该方法的API,它会告诉你更好的方法。

如何解决这个问题,并在每次窗口打开时将焦点放在文本字段上?

默认情况下,焦点应转到框架左上角的html" target="_blank">组件。如果这没有发生,那么你正在做一些奇怪的事情。

如果您的文本字段不是框架上的第一个组件,那么您只能在图形用户界面变得可见后将焦点设置在它上。

根据发布的代码,文本字段似乎位于按钮上方,因此应该获得焦点。可能问题在于您使用的是空布局,以及向框架中添加组件的顺序。如果没有适当的MCVE,我们无法判断。

对代码的其他建议:

>

  • 不要使用空布局和setBounds()。您不应该手动设置设计用于布局管理器的大小/摆动。

    无需为每个按钮创建唯一的ActionListener。您可以创建一个通用侦听器,供每个按钮共享。查看:如何在java中为jbutton添加快捷键?有关此方法的工作示例。

    我正试图找出如何创建MCVE版本来演示这个问题

    这不是什么大谜团。你说你有一个框架和一个文本字段,它起作用了。然后你添加了一个按钮,但它不起作用。因此,MCVE将简单地由一个带有文本字段和按钮的框架组成。游戏逻辑与你的问题无关,因此不需要。所以MCVE应该是大约10-15行代码。

  •  类似资料:
    • 我是一个新的android工作室,所以很抱歉,如果这是一个非常愚蠢的问题,但我不能找到答案在任何地方网上。非常感谢任何帮助! 我已经建立了一个小的应用程序,有两个屏幕:一个主屏幕,一个屏幕二。主屏幕只是导航到屏幕二。从另一个屏幕,你可以播放/暂停/停止一首特定的歌曲,或者回到主屏幕。 我遇到的问题是当我导航到屏幕二时,当我按下“后退”按钮返回主屏幕时,我无法弄清楚如何将“停止”方法添加到这个按钮上

    • 问题内容: 我搜索了在jtable中添加按钮的教程,并从http://tips4java.wordpress.com/2009/07/12/table-button- column/ 找到了一个类文件, 该按钮在哪里设置? 问题答案: 它是通过DefaultTableModel中的数据在表渲染器和编辑器中自动设置的。例如,对于表编辑器,代码为: 表模型的值在哪里。有关详细信息,请参见ButtonC

    • 当我请求“http://localhost:8080/project/home”时,它会将我踢出“/login”。成功登录后,我现在可以查看“/home” 然后添加OAuth2,这与Sparklr2示例非常相同 } 只有1个客户端详细信息 我在我的tomcat服务器上运行它,OAuth工作,我向发出请求,它成功地将token返回给我。 我重新启动我的应用程序,然后请求,但没有登录,它会显示我的ho

    • 我有一个文本框。当我单击“添加”按钮时,我将键发送到文本框,我想添加另一行,所以我再次单击“添加”按钮,但它正在添加另一个输入框来输入值,但它总是覆盖第一行。//单击添加行按钮//ngDriver。FindElement(ByXPath("//div[1]/div[3]/form/div/field dset[2]/div/div[4]/按钮")。单击();

    • 我有一个服务和一个交流的活动。当我点击按钮(我有galaxy s3,只有一个按钮)时,我的活动当然不满意,我的服务继续运行,但如果我点击后退(触摸)按钮,那么我的服务就被破坏了。我该如何改变这一点?我希望服务一直运行,直到活动破坏它。 活动:

    • 问题内容: 我正在做一个数独求解器,为此,我希望我的JTextFields只接受数字123456789中的一个作为有效输入。因此,我将MaskFormatter与JFormattedTextField一起使用。但是,当我通过执行.setText(“”)清除所有TextField时,MaskFormatter不再起作用。清除文本框后,我可以再次在其中写入任何内容。为什么以及如何解决? 我的代码基本上