情况:我有一个带有一个按钮和一个微调器的Swing JDialog。我想在微调器中输入的文本不是数字时禁用(灰显)按钮,并在文本输入是有效数字时重新启用它。 (在我的应用程序中,如果输入无效,我也会显示JLabel,预期的行为应该与Eclipse中的“Go to line”对话框非常相似。)
问题:在微调器中输入文本后(并将焦点保持在微调器上),当单击按钮时,只需单击两次即可实际执行ActionListener而不是一次。
注意:如果我在对话框中添加了另一个无法启用/禁用的按钮,单击此其他按钮只需单击一下即可执行ActionListener。
请您告诉我如何在上下文中执行ActionListener,只需单击一下按钮?感谢。
代码:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class Frame extends JDialog implements DocumentListener, ActionListener{
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Frame frame = new Frame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
private JTextField spinnerTextField;
private JButton button;
public Frame(){
setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
JSpinner spinner = new JSpinner();
spinner.setMaximumSize(spinner.getPreferredSize());
JSpinner.DefaultEditor spinnerEditor = (JSpinner.DefaultEditor) spinner.getEditor();
spinnerTextField = spinnerEditor.getTextField();
spinnerTextField.getDocument().addDocumentListener(this);
button = new JButton("Button");
button.setMaximumSize(button.getPreferredSize());
button.addActionListener(this);
JPanel myPanel = new JPanel();
myPanel.add(spinner);
myPanel.add(button);
getContentPane().add(myPanel);
pack();
}
@Override
public void changedUpdate(DocumentEvent arg0) {}
@Override
public void insertUpdate(DocumentEvent arg0) {
verify();
}
@Override
public void removeUpdate(DocumentEvent arg0) {
verify();
}
private void verify(){
try{
Integer.parseInt( spinnerTextField.getText().trim() );
button.setEnabled(true);
}catch(NumberFormatException e){
button.setEnabled(false);
}
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Button clicked");
}
}