Как проверить, какое текстовое поле является фокусируемым? - PullRequest
0 голосов
/ 01 января 2019

Я создал кнопки 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);
        }
    });

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Вы должны использовать TextAction для ActionListener вашей кнопки.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);

Вышеуказанное действие является общим, поэтому оно может использоваться всеми вашими кнопками.Он просто добавит текст кнопки к последнему текстовому полю, в котором был фокус.

0 голосов
/ 01 января 2019

Вы показываете только фрагменты кода, но, похоже, вы пытаетесь отслеживать, какое поле выбрано с помощью логического значения.Я пропущу логическое значение и введу новую переменную

JTextField current;

, которая должна быть назначена в каждом методе focusGained.Пропустить все назначения в методах focusLost.Таким образом вы сможете отслеживать текущее активное текстовое поле.Также обратите внимание, что методы focusLost будут вызываться, когда пользователь нажимает кнопку, поэтому их не следует использовать.

...