2013-11-18 2 views
2

У меня есть несколько текстовых полей и кнопок. Когда текстовое поле выбрано, текст должен быть добавлен к нему, когда нажимается кнопка, но ничего не вставлено в следующий код. что я пропустил. Спасибо за помощь.как поле ввода 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 в текстPasswordField, но это не так.

+0

ли реализовать ваш класс 'ActionListener' ?. Вы должны показать полный код запуска. –

+0

http://www.sscce.org/ – broncoAbierto

+0

try selectedTextField.setEnabled (true) –

ответ

1

Вы уверены, что

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; 
} 

}

0

не используйте 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(); 
    } 
} 

Затем использовать Action вы могли бы сделать:

b9.addActionListener(new SelectAll()); 
Смежные вопросы