【问题标题】:How to check which text field is focusable?如何检查哪个文本字段是可聚焦的?
【发布时间】:2019-05-28 11:10:45
【问题描述】:

我创建了按钮 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);
        }
    });

【问题讨论】:

    标签: java swing focus jtextfield


    【解决方案1】:

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

    JTextField current;
    

    应该在每个 focusGained 方法中分配。跳过 focusLost 方法中的所有分配。因此,您将能够跟踪当前活动的文本字段。 另请注意,当用户单击按钮时将调用 focusLost 方法,因此不应使用它们。

    【讨论】:

    • 你的意思是用 JTextField cuurent 替换布尔变量?
    • 没错!单个布尔值无法帮助您了解哪个字段最后获得焦点。
    • 我希望清楚数字的按钮只需要对当前字段进行操作。
    • 1) 为了尽快获得更好的帮助,edit 添加minimal reproducible exampleShort, Self Contained, Correct Example。 (从 两个 文本字段开始。) 2) 使用逻辑一致的缩进代码行和块的形式。缩进是为了让代码流更容易理解! 3) 源代码中的一个空白行是永远需要的。 { 之后或} 之前的空行通常也是多余的。 ..
    • .. 4) Java GUI 必须在不同的语言环境中使用不同的 PLAF 在不同的操作系统、屏幕尺寸、屏幕分辨率等上工作。因此,它们不利于像素完美布局。而是使用布局管理器,或 combinations of them 以及 white space 的布局填充和边框。
    【解决方案2】:

    您应该为按钮的ActionListener 使用TextActionTextAction 实现了一个 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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2017-11-13
      • 2020-12-07
      • 1970-01-01
      相关资源
      最近更新 更多