#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") );