Java 如何检查哪个文本字段是可聚焦的?

Java 如何检查哪个文本字段是可聚焦的?,java,swing,focus,jtextfield,Java,Swing,Focus,Jtextfield,我创建了按钮0-9以及4个文本字段(JTextField)。我试图允许用户点击任何数字0-9,以输入到每个文本字段。但是,我无法确定用户单击了哪个字段。因此,当用户选择第二个字段时,它不会显示任何文本,它只在第一个字段上工作 field = new JTextField(); field.setHorizontalAlignment(SwingConstants.RIGHT); field.setText(""); field.setBounds(12, 12, 66,

我创建了按钮0-9以及4个文本字段(
JTextField
)。我试图允许用户点击任何数字0-9,以输入到每个文本字段。但是,我无法确定用户单击了哪个字段。因此,当用户选择第二个字段时,它不会显示任何文本,它只在第一个字段上工作

field = new JTextField();
    field.setHorizontalAlignment(SwingConstants.RIGHT);
    field.setText("");
    field.setBounds(12, 12, 66, 34);
    field.setBackground(Color.WHITE);
    frame.getContentPane().add(field);
    field.setColumns(10);
    field.setFont(new Font("Liberation Mono", Font.BOLD, 
20));
    field.setFocusable(true);
    field.addFocusListener(new FocusListener() {

        @Override
        public void focusLost(FocusEvent arg0) {
             f=false;
        }

        @Override
        public void focusGained(FocusEvent arg0) {
             f=true;
        }
    });

    field2 = new JTextField();
    field2.setText("");
    field2.setHorizontalAlignment(SwingConstants.RIGHT);
    field2.setFont(new Font("Liberation Mono", Font.BOLD, 
20));
    field2.setColumns(10);
    field2.setBackground(Color.WHITE);
    field2.setBounds(90, 12, 66, 34);
    field2.setFocusable(true);
    field2.addFocusListener(new FocusListener() {

        @Override
        public void focusLost(FocusEvent arg0) {
            f = false;
        }

        @Override
        public void focusGained(FocusEvent arg0) {
            f = true;
        }
    });
    frame.getContentPane().add(field2);

    field3 = new JTextField();
    field3.setFont(new Font("Liberation Mono", Font.BOLD, 
20));
    field3.setHorizontalAlignment(SwingConstants.RIGHT);
    field3.setBounds(199, 12, 66, 34);
    frame.getContentPane().add(field3);
    field3.setColumns(10);
    field3.setFocusable(true);
    field3.addFocusListener(new FocusListener() {

        @Override
        public void focusLost(FocusEvent arg0) {
            f=false;
        }

        @Override
        public void focusGained(FocusEvent arg0) {
             f=true;
        }
    });

    field4 = new JTextField();
    field4.setText("");
    field4.setHorizontalAlignment(SwingConstants.RIGHT);
    field4.setFont(new Font("Liberation Mono", Font.BOLD, 
20));
    field4.setColumns(10);
    field4.setBackground(Color.WHITE);
    field4.setBounds(277, 12, 66, 34);
    frame.getContentPane().add(field4);
    field4.setFocusable(true);
    field4.addFocusListener(new FocusListener() {

        @Override
        public void focusLost(FocusEvent arg0) {
             f = false;
        }

        @Override
        public void focusGained(FocusEvent arg0) {
             f = true;
        }
    });
按钮示例:

 JButton btn0 = new JButton("0");
    btn0.setFont(new Font("Tahoma",Font.BOLD,15));
    btn0.setBounds(199, 228, 80, 30);
    frame.getContentPane().add(btn0);
    btn0.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
                if (f==false) {
                    String num = 
 field.getText()+btn0.getText();
                    field.setText(num);

                }else if (f==false) {
                    String num = 
 field2.getText()+btn0.getText();
                    field2.setText(num);
                }else if (f==false) {
                    String num = 
field3.getText()+btn0.getText();
                    field3.setText(num);
                }
                String 
num=textField.getText()+btn0.getText();
                textField.setText(num);
        }
    });

您只显示了代码片段,但我认为您试图使用布尔值跟踪选择的字段。 我将跳过布尔值并引入一个新变量

JTextField current;
应该在每个FocusGoven方法中指定。跳过focusLost方法中的所有赋值。因此,您将能够跟踪当前活动文本字段。
还请注意,当用户单击按钮时,将调用focusLost方法,因此不应使用它们。

您仅显示代码片段,但我看起来您试图使用布尔值跟踪选择的字段。 我将跳过布尔值并引入一个新变量

JTextField current;
应该在每个FocusGoven方法中指定。跳过focusLost方法中的所有赋值。因此,您将能够跟踪当前活动文本字段。
还请注意,当用户单击按钮时,将调用focusLost方法,因此不应使用它们。

对于按钮的
ActionListener
,应使用
TextAction
TextAction
实现了一个
getFocusedComponent()
方法,该方法将向您返回具有焦点的最后一个文本组件

因此,要将文本附加到具有焦点的最后一个文本组件,代码如下所示:

TextAction digit = new TextAction()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        JButton button = (JButton)e.getSource();
        JTextComponent textField = getFocusedComponent();
        textField.replaceSelection( button.getText() );
    }
}

JButton button0 = new JButton("0");
button0.addActionListener(digit);
JButton button1 = new JButton("1");
button1.addActionListener(digit);

上面的操作是通用的,因此您的所有按钮都可以使用它。它将简单地将按钮的文本附加到具有焦点的最后一个文本字段。

对于按钮的
ActionListener
,您应该使用
TextAction
TextAction
实现了一个
getFocusedComponent()
方法,该方法将向您返回具有焦点的最后一个文本组件

因此,要将文本附加到具有焦点的最后一个文本组件,代码如下所示:

TextAction digit = new TextAction()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        JButton button = (JButton)e.getSource();
        JTextComponent textField = getFocusedComponent();
        textField.replaceSelection( button.getText() );
    }
}

JButton button0 = new JButton("0");
button0.addActionListener(digit);
JButton button1 = new JButton("1");
button1.addActionListener(digit);

上面的操作是通用的,因此您的所有按钮都可以使用它。它将简单地将按钮的文本附加到具有焦点的最后一个文本字段。

您的意思是用JTextField cuurent替换布尔变量?没错!单个布尔值无法帮助您知道哪个字段最后有焦点。我希望很明显,数字按钮只需要在当前字段上操作。1)为了更快获得更好的帮助,请添加或。(从两个文本字段开始。)2)使用缩进代码行和代码块的逻辑和一致形式。缩进的目的是使代码的流程更易于遵循!3) 在源代码中只需要一行空白就可以了。
{
之后或
}
之前的空行通常也是多余的。。。。4) Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作,在不同的地区使用不同的PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或者与布局填充和边框一起使用。您的意思是将布尔变量替换为JTextField cuurent?没错!单个布尔值无法帮助您知道哪个字段最后有焦点。我希望很明显,数字按钮只需要在当前字段上操作。1)为了更快获得更好的帮助,请添加或。(从两个文本字段开始。)2)使用缩进代码行和代码块的逻辑和一致形式。缩进的目的是使代码的流程更易于遵循!3) 在源代码中只需要一行空白就可以了。
{
之后或
}
之前的空行通常也是多余的。。。。4) Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作,在不同的地区使用不同的PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或与布局填充和边框一起使用。