Как поле ввода FocusEvent и кнопка использования
У меня есть несколько текстовых полей и кнопок. Когда текстовое поле выделено, текст должен быть добавлен в него при нажатии кнопки, но ничего не вставлено с кодом ниже. что я пропустил Спасибо за вашу помощь.
public class ButtonExample_Extended extends JFrame implements ActionListener {
public JPanel createContentPane (){
buttonPanel = new JPanel();
buttonPanel.setLayout(null);
buttonPanel.setLocation(10, 50);
buttonPanel.setSize(1370, 770);
totalGUI.add(buttonPanel);
B9 = new JButton("9");
B9.setLocation(1190, 570);
B9.setSize(50, 50);
B9.addActionListener(this);
buttonPanel.add(B9);
JPasswordField passwordField = new JPasswordField(20);
passwordField.setLocation(900,565);
passwordField.setSize(120,30);
buttonPanel.add(passwordField);
}
private JTextComponent selectedTextField;
// TextFields onFocus event
private void a33FocusGained(java.awt.event.FocusEvent evt) {
selectedTextField = (JTextComponent) evt.getSource();
}
// action for button
public void actionPerformed (ActionEvent evt) {
if (evt.getSource() == B9)
selectedTextField.setText( selectedTextField.getText() + "9" );
}
}
с вышеупомянутым кодом я ожидал вставить 9 в textPasswordField, но это не так.
2 ответа
Вы уверены, что
private void a33FocusGained(java.awt.event.FocusEvent evt) {
selectedTextField = (JTextComponent) evt.getSource();
}
когда-нибудь называется? Я думаю, что ваш класс должен реализовать FocusListener и добавить что-то вроде
passwordField.addFocusListener(this);
@Override
public void focusGained(FocusEvent e) {
selectedTextField = (JTextComponent) e.getSource();
}
@Override
public void focusLost(FocusEvent e) {
selectedTextField = null;
}
Это пример кода того, что вы должны сделать (если я вас правильно понял), обратите внимание, что сначала вам нужно установить курсор на поле пароля, а после этого кнопка будет работать, однако вы можете увидеть плохую сторону этого подхода в метод focusLost
public class Snippet implements ActionListener, FocusListener {
public JFrame totalGUI = new JFrame();
private JPanel buttonPanel;
private JButton B9;
public Snippet() {
createContentPane();
}
public void createContentPane() {
buttonPanel = new JPanel(new GridBagLayout());
B9 = new JButton("9");
B9.addActionListener(this);
buttonPanel.add(B9);
JPasswordField passwordField = new JPasswordField(20);
passwordField.setSize(120, 30);
passwordField.addFocusListener(this);
buttonPanel.add(passwordField);
totalGUI.getContentPane().add(buttonPanel);
totalGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
totalGUI.pack();
}
private JTextComponent selectedTextField;
@Override
public void actionPerformed(ActionEvent evt) {
if (evt.getSource() == B9 && selectedTextField != null)
selectedTextField.setText(selectedTextField.getText() + "9");
}
public static void main(String[] args) {
new Snippet().totalGUI.setVisible(true);
}
@Override
public void focusGained(FocusEvent e) {
if(e.getSource() instanceof JTextComponent)
selectedTextField = (JTextComponent) e.getSource();
}
@Override
public void focusLost(FocusEvent e) {
// when you push the button the text field will lose focus
// selectedTextField = null;
}
}
Не используйте FocusListener и ActionListener вместе. Это предполагает, что события будут запускаться в определенном порядке, то есть сначала focusGained, а затем actionPerformed. Swing не дает никаких гарантий относительно порядка событий.
Вместо этого вы можете продлить TextAction
, TextAction - это специальное действие, используемое компонентами Swing, потому что оно отслеживает последний компонент, у которого был фокус. Например, чтобы создать действие, которое выделяет весь текст, который вы можете сделать:
class SelectAll extends TextAction
{
public SelectAll()
{
super("Select All");
}
public void actionPerformed(ActionEvent e)
{
JTextComponent component = getFocusedComponent();
component.selectAll();
component.requestFocusInWindow();
}
}
Затем, чтобы использовать Действие, вы должны сделать:
b9.addActionListener( new SelectAll() );