当焦点在JSpinner上时,需要在按钮上单击两次

时间:2013-06-07 22:33:34

标签: java swing jspinner

情况:我有一个带有一个按钮和一个微调器的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");
    }
}

0 个答案:

没有答案