JSpinner值更改事件

use*_*501 36 java swing event-handling jspinner changelistener

如何在更改jSpinner值时立即进行更新.

ChangeListener listener = new ChangeListener() {
  public void stateChanged(ChangeEvent e) {
    jLabel.setText(e.getSource());
  }
};

spinner1.addChangeListener(listener);
Run Code Online (Sandbox Code Playgroud)

上面的代码不会自动更改标签文本,它需要您再次单击任何位置进行更新.

kle*_*tra 46

答案是配置JFormattedTextField中使用的格式化程序,它是spinner编辑器的子代:

    formatter.setCommitsOnValidEdit(true);
Run Code Online (Sandbox Code Playgroud)

不幸的是,一手拿着它就像介绍性句子一样冗长而肮脏:

    final JSpinner spinner = new JSpinner();
    JComponent comp = spinner.getEditor();
    JFormattedTextField field = (JFormattedTextField) comp.getComponent(0);
    DefaultFormatter formatter = (DefaultFormatter) field.getFormatter();
    formatter.setCommitsOnValidEdit(true);
    spinner.addChangeListener(new ChangeListener() {

        @Override
        public void stateChanged(ChangeEvent e) {
            LOG.info("value changed: " + spinner.getValue());
        }
    });
Run Code Online (Sandbox Code Playgroud)

稍微(但不是很多)更简洁的方式可能是继承NumberEditor并公开允许配置的方法

  • Oracle示例不使用getComponent的详细信息,而是使用以下顺序来检索JFormattedTextField:`public JFormattedTextField getTextField(JSpinner spinner){ 我已经删除了错误检查,但这是另一种可能性。 (2认同)

tra*_*god 8

您显示的代码显示正确.作为参考,这是一个工作示例.

附录:当JSpinner有焦点时,左右箭头键移动插入符号.向上箭头递增,向下箭头递减包含插入符号的字段.旋转器和标签中的变化(有效)同时发生.

要访问JFormattedTextFieldJSpinner.DateEditor,用父母的getTextField()方法.然后可以使用合适的插入符听众或文本输入监听器来根据需要更新标签.

附录:setCommitsOnValidEdit根据此处的建议更新使用.

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JSpinner.DateEditor;
import javax.swing.SpinnerDateModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.text.DefaultFormatter;

/**
 * @see https://stackoverflow.com/questions/2010819
 * @see https://stackoverflow.com/questions/3949518
 */
public class JSpinnerTest extends JPanel {

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame("JSpinnerTest");
                f.add(new JSpinnerTest());
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.pack();
                f.setVisible(true);
            }
        });
    }

    public JSpinnerTest() {
        super(new GridLayout(0, 1));
        final JLabel label = new JLabel();
        final JSpinner spinner = new JSpinner();
        Calendar calendar = Calendar.getInstance();
        Date initDate = calendar.getTime();
        calendar.add(Calendar.YEAR, -5);
        Date earliestDate = calendar.getTime();
        calendar.add(Calendar.YEAR, 10);
        Date latestDate = calendar.getTime();
        spinner.setModel(new SpinnerDateModel(
            initDate, earliestDate, latestDate, Calendar.MONTH));
        DateEditor editor = new JSpinner.DateEditor(spinner, "MMM yyyy");
        spinner.setEditor(editor);
        JFormattedTextField jtf = editor.getTextField();
        DefaultFormatter formatter = (DefaultFormatter) jtf.getFormatter();
        formatter.setCommitsOnValidEdit(true);
        spinner.addChangeListener(new ChangeListener() {

            @Override
            public void stateChanged(ChangeEvent e) {
                JSpinner s = (JSpinner) e.getSource();
                label.setText(s.getValue().toString());
            }
        });
        label.setText(initDate.toString());
        this.add(spinner);
        this.add(label);
    }
}
Run Code Online (Sandbox Code Playgroud)