【问题标题】:How to remove focus from textfield and set it on button?如何从文本字段中删除焦点并将其设置在按钮上?
【发布时间】:2021-04-12 20:08:29
【问题描述】:

这是这些程序中的简单计数器 gui 程序,通过按右箭头计数器增加 1,但问题是每当我运行程序然后按右箭头时,计数器不会增加 1,而是按右箭头文本字段中的光标从左向右移动为什么会发生这种情况?

import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class CounterDemo implements KeyListener
{
    JTextField jtf;
    JButton jb,jb1;
    int i=0;
    public CounterDemo ()
    {
        JFrame jf = new JFrame();
        jf.setBounds(100,100,400,400);
        jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        jf.setLayout(null);


        jtf = new JTextField("0");
        jtf.setBounds(60,10,50,20);
        jf.add(jtf);

        JButton jb = new JButton("next");
        JButton jb1 = new JButton("prev");
        jb.setBounds(10,35,75,20);
        jb1.setBounds(90,35,75,20);

        jf.add(jb);
        jf.add(jb1);

        jb.addKeyListener(this);
        jb1.addKeyListener(this);
        jf.setVisible(true);
    }
    public static void main(String[] args)
    {
        new CounterDemo();
    }

    public void keyPressed(KeyEvent ke)
    {
        if(ke.getKeyCode() == KeyEvent.VK_RIGHT)
        {
            i++;
            jtf.setText(" "+i);
        }
        else if (ke.getKeyCode() == KeyEvent.VK_LEFT)
        {
            i--;
            jtf.setText(" "+i);
        }
    }

    public void keyTyped(KeyEvent ke)
    {

    }

    public void keyReleased(KeyEvent ke)
    {

    }
}

【问题讨论】:

  • 你真正想做什么?您的代码只是学习 Swing 的练习吗?当JButton 获得焦点时,您的KeyListener 将运行。要了解焦点的工作原理,请参阅How to Use the Focus Subsystem。对于JButton,您应该添加ActionListener 而不是KeyListener。在任何情况下,key bindings 通常都比KeyListener 好。
  • 也许JSpinner更合适?
  • Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上使用不同的语言环境中的不同 PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或 combinations of them 以及 white space 的布局填充和边框。
  • 我同意@Abra re JSpinner。它为此完美设计。 OTOH 如果坚持使用文本字段/按钮组合,请添加 ActionListener 而不是 KeyListener。并修复该布局!

标签: java swing user-interface jbutton jtextfield


【解决方案1】:

添加jtf.setFocusable(false) 使文本字段最初不在焦点中。

编辑:正如Abra 所说,这将使文本字段永远不会成为焦点。另一种解决方案是执行jb.grabFocus() 之类的操作,让按钮而不是文本字段获得焦点。

【讨论】:

  • 使文本字段最初不在焦点中文本字段将永远处于焦点。还有其他方法可以设置最初聚焦的组件。
  • 没错,我已根据您的评论编辑了我的答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 2012-12-29
  • 2015-03-19
相关资源
最近更新 更多