Java Swing как определить несколько слушателей фокуса в JTextFields, но с разными действиями кнопок

#java #swing

#java #swing

Вопрос:

Я создаю JTextFields, которые должны заполняться при нажатии на кнопку.

Предположим, для примера:

      txtField1.addFocusListener(new FocusListener() {
            JTextField field = txtField1;
            @Override
            public void focusGained(FocusEvent e) {
                btnMain_0.addActionListener(ee -> {

                    if (field.getText().length() > 4)
                        return;
                    else
                        field.setText((field.getText()   "0"));
                });

            }

            @Override
            public void focusLost(FocusEvent e) {
            
            }
        });




 txtField2.addFocusListener(new FocusListener() {
            JTextField field = txtField2;
            @Override
            public void focusGained(FocusEvent e) {
                btnMain_0.addActionListener(ee -> {

                    if (field.getText().length() > 4)
                        return;
                    else
                        field.setText((field.getText()   "0"));
                });

            }

            @Override
            public void focusLost(FocusEvent e) {
            
            }
        });
 

Но если я нажму на txtField1 и нажму btnMain_0, он введет 0.
Затем, если я нажму на txtField2 и нажму btnMain_0, он введет 00 (считалось, что нужно нажать btnMain_0 два раза).

Как я могу это сделать? Есть ли лучшее решение для двух прослушивателей запуска из списка jtextfields?

Ответ №1:

Вы можете определить пользовательский TextAction и добавить его к своим кнопкам.

TextAction Позволяет отслеживать последний текстовый компонент, который имел фокус (перед нажатием на кнопку).

Что-то вроде:

 class KeyboardAction extends TextAction
{
    private String letter;

    public KeyboardAction(String letter)
    {
        super(letter);
        this.letter = letter;
    }

    public void actionPerformed(ActionEvent e)
    {
        JTextComponent component = getFocusedComponent();
        component.setCaretPosition( component.getDocument().getLength() );
        component.replaceSelection( letter );
    }
}
 

Затем вы используете класс, подобный:

 jButton1 = new JButton( new KeyboardAction("1") );
jButton2 = new JButton( new KeyboardAction("2") );
 

или вы добавляете действие к существующей кнопке, используя:

 button.setAction( new KeyboardAction("1") );