JSpinner的用微调按钮可以改变值, 这个改变可以用ChangeListener来捕捉. 但是如果是直接输入的数据, 这个事件应该用何种类型的Listener来监听?我是想实现这个一个功能: 如果JSpinner的值改变了, 则把一个按钮的变成可用. 但是输入的(不是用按钮调的)如果是一个合法的值, 仍然把按钮变成可用.

解决方案 »

  1.   

    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.*;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;public class TestGUI extends JFrame {

    public TestGUI() {
    this.setBounds(300, 300, 300, 300);
    Container c = this.getContentPane();

    final JButton button = new JButton("Apply");
    button.setEnabled(false);
    button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    ((JButton)e.getSource()).setEnabled(false);
    }});

    JSpinner js = new JSpinner(new SpinnerNumberModel(0, 0, 1, 0.01));
    js.setEditor(new JSpinner.NumberEditor(js, "0%"));
    js.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e) {
    // TODO Auto-generated method stub
    button.setEnabled(true);
    }

    }); c.add(button, "North");
    c.add(js, "Center");
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    new TestGUI();
    }}
    这是已经实现了的代码, 现在问题是如果我输入一个合法的百分数, 我想让BUTTON也变成可用, 应该怎么做.
    实现后马上结贴.
      

  2.   

    这个要输入完成之后才触发, 可以用失去焦点触发Listener或者你输入值得长度是固定的,使用键盘Listener,监视输入,一旦位数达到固定值,就比较判断是否设置Button
      

  3.   

    PS : 你的代码,输入后,回车就可以了
    -----------------------------------
    确实是这样, 但是我希望的是即时输入就触发, 并且同时进行合法检查. 如果合法BUTTON就可用, 不合法仍然保持灰的.
      

  4.   

    加人keyListener即可
    import java.awt.Container;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JSpinner;
    import javax.swing.SpinnerNumberModel;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;public class TestGUI extends JFrame {
    JSpinner js; JButton button; public TestGUI() {
    this.setBounds(300, 300, 300, 300);
    Container c = this.getContentPane(); button = new JButton("Apply");
    button.setEnabled(false);
    button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    ((JButton) e.getSource()).setEnabled(false);
    }
    }); js = new JSpinner(new SpinnerNumberModel(0, 0, 1, 0.01));
    JSpinner.NumberEditor editor = new JSpinner.NumberEditor(js, "0%");
    editor.getTextField().addKeyListener(new KeyListener() {
    public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) {
    String text = ((JSpinner.NumberEditor) js.getEditor())
    .getTextField().getText();
    int value = Integer.parseInt(text.substring(0,
    text.length() - 1));
    if (value >= 0 && value <= 100) {
    button.setEnabled(true);
    } else {
    button.setEnabled(false);
    } } public void keyTyped(KeyEvent e) { }
    });
    js.setEditor(editor);
    js.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) {
    // TODO Auto-generated method stub
    button.setEnabled(true);
    } }); c.add(button, "North");
    c.add(js, "Center");
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    } /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    new TestGUI();
    }}
      

  5.   

    楼上的思路是对的,至于异常,楼主不会连这个都不会处理吧??
    ------------------------------
    确实如此, 惭愧啊, 真的没有想到太完美的解决办法. 可以提示一下吗? 不要告诉我用try catch.
    其实用keylistener也不是我想用的方案, 因为这样做相当于完全抛弃了JSpinner的Editor本身所的作用, 而是把判断是否合法的工作完全留给了自己, 但除了这个好像也没有什么太好的方案能够实时检查输入是否合法.
    没什么新的建议明天就结贴了.