Java 如何使用DefaultEditor方法检查JSpinner字段上的手动编辑

Java 如何使用DefaultEditor方法检查JSpinner字段上的手动编辑,java,swing,jspinner,Java,Swing,Jspinner,我从这里改编代码: 编辑2 当我按下向上微调器箭头时,以下代码为我提供了一个无限循环的对话框: 字符串: 字符串:10 VAL:10 字符串: 字符串:10 VAL:10 字符串: 字符串:10 VAL:10 警告:您将需要使用taskmanager来杀死它 public static void main(String[] args) { // TODO Auto-generated method stub JFrame F = new JFrame();

我从这里改编代码:

编辑2

当我按下向上微调器箭头时,以下代码为我提供了一个无限循环的对话框:

字符串: 字符串:10 VAL:10 字符串: 字符串:10 VAL:10 字符串: 字符串:10 VAL:10

警告:您将需要使用taskmanager来杀死它

    public static void main(String[] args) {
    // TODO Auto-generated method stub

    JFrame F = new JFrame();
    F.setVisible(true);
    JPanel p = new JPanel();


    final JSpinner spin2 = new JSpinner();
    spin2.setModel(new SpinnerNumberModel(10, 10, 100, 1));

    JComponent comp = spin2.getEditor();
    JFormattedTextField field = (JFormattedTextField) comp.getComponent(0);
    DefaultFormatter formatter = (DefaultFormatter) field.getFormatter();
    formatter.setCommitsOnValidEdit(true);


    ((JSpinner.DefaultEditor)spin2.getEditor()).getTextField().getDocument().addDocumentListener(new DocumentListener() {
          public void changedUpdate(DocumentEvent e) {
                warn();
              }
              public void removeUpdate(DocumentEvent e) {
                warn();
              }
              public void insertUpdate(DocumentEvent e) {
                warn();
              }

              public void warn() {
                  String text = ((JSpinner.DefaultEditor)spin2.getEditor()).getTextField().getText();
                  JOptionPane.showMessageDialog(null,   "STRING: "+text, "Error Massage",     JOptionPane.ERROR_MESSAGE);
                  if (text != null && !text.trim().isEmpty()) {
                      int stringValue = Integer.parseInt(((JSpinner.DefaultEditor)spin2.getEditor()).getTextField().getText());
                      JOptionPane.showMessageDialog(null,
                              "VALS: "+spin2.getValue(), "Error Massage",
                              JOptionPane.ERROR_MESSAGE);
                     if (stringValue<10 || stringValue >100){
                       JOptionPane.showMessageDialog(null,
                          "Error: Number outside bounds", "Error Massage",
                          JOptionPane.ERROR_MESSAGE);
                     }

                  }
              }
            });


    p.add(spin2);   


    F.add(p);
    F.pack();
    F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


}
//////////////////////////////////////////////////////////////////////////////////////////////////

原始问题

但若我使用微调器来输入低于下限的值。我在文本字段中得到一个“(”,此错误:

线程“AWT-EventQueue-0”java.lang.NumberFormatException中的异常:用于输入字符串:“” 位于java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 在java.lang.Integer.parseInt(Integer.java:504) 在java.lang.Integer.parseInt(Integer.java:527)处 在com.NResearch.ValueAtRisk.Sigma$7.warn(Sigma.java:626) 在com.NResearch.ValueAtRisk.Sigma$7.removeUpdate(Sigma.java:619) 位于javax.swing.text.AbstractDocument.fireRemoveUpdate(AbstractDocument.java:260) 位于javax.swing.text.AbstractDocument.HandlerMemove(AbstractDocument.java:623) 位于javax.swing.text.AbstractDocument.remove(AbstractDocument.java:591) 位于javax.swing.text.AbstractDocument.replace(AbstractDocument.java:667) 位于javax.swing.text.JTextComponent.setText(JTextComponent.java:1718) 位于javax.swing.JFormattedTextField$AbstractFormatter.install(JFormattedTextField.java:949) 位于javax.swing.text.DefaultFormatter.install(DefaultFormatter.java:124) 位于javax.swing.text.InternationalFormatter.install(InternationalFormatter.java:285) 位于javax.swing.JFormattedTextField.setFormatter(JFormattedTextField.java:465) 位于javax.swing.JFormattedTextField.setValue(JFormattedTextField.java:789) 位于javax.swing.JFormattedTextField.processFocusEvent(JFormattedTextField.java:636) 位于java.awt.Component.processEvent(Component.java:6261) 位于java.awt.Container.processEvent(Container.java:2229) 位于java.awt.Component.dispatchEventImpl(Component.java:4861) 位于java.awt.Container.dispatchEventImpl(Container.java:2287) 位于java.awt.Component.dispatchEvent(Component.java:4687) 在java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1895)中 在java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:938)中 位于java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:570) 位于java.awt.Component.dispatchEventImpl(Component.java:4731) 位于java.awt.Container.dispatchEventImpl(Container.java:2287) 位于java.awt.Component.dispatchEvent(Component.java:4687) 位于java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735) 在java.awt.EventQueue.access$200(EventQueue.java:103) 位于java.awt.EventQueue$3.run(EventQueue.java:694) 在java.awt.EventQueue$3.run(EventQueue.java:692) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 位于java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 在java.awt.EventQueue$4.run(EventQueue.java:708) 在java.awt.EventQueue$4.run(EventQueue.java:706) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 位于java.awt.EventQueue.dispatchEvent(EventQueue.java:705) 位于java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 在java.awt.EventDispatchThread.PumpeEventsforFilter(EventDispatchThread.java:161) 位于java.awt.EventDispatchThread.PumpeEventsforHierarchy(EventDispatchThread.java:150) 位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 在java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

final JSpinner spin2=new JSpinner();
spin2.setModel(新喷丝头编号模型(10,10,100,1));
JComponent comp=spin2.getEditor();
JFormattedTextField=(JFormattedTextField)组件getComponent(0);
DefaultFormatter formatter=(DefaultFormatter)字段。getFormatter();
setCommitsonValidIt(true);
((JSpinner.DefaultEditor)spin2.getEditor()).getTextField().getDocument().addDocumentListener(新DocumentListener()){
公共作废更改日期(记录事件e){
警告();
}
公共作废移除更新(文档事件e){
警告();
}
公共作废插入更新(文档事件e){
警告();
}
公开无效警告(){
int stringValue=Integer.parseInt(((JSpinner.DefaultEditor)spin2.getEditor()).getTextField().getText());
JOptionPane.showMessageDialog(null,
“VAL:+spin2.getValue(),“错误信息”,
JOptionPane.ERROR\u消息);
如果(字符串值100){
JOptionPane.showMessageDialog(null,
“错误:请输入大于0的数字”,“错误信息”,
JOptionPane.ERROR\u消息);
}
}
});

异常说明传递给
Integer.parseInt(..)
的字符串是空字符串。因此,在传递给
Integer.parseInt(..)之前,请确保检查
((JSpinner.DefaultEditor)spin2.getEditor()).getTextField().getText()
是否为null和空。


您可以看看apache commons io和StringUtils类,它们有很多很好的方法来减轻检查空/空字符串的痛苦

例外情况是,传递给
Integer.parseInt(…)
的字符串是空字符串。因此请确保检查
((JSpinner.DefaultEditor)spin2.getEditor)
        ((JSpinner.DefaultEditor)Position.getEditor()).getTextField().addPropertyChangeListener(new PropertyChangeListener() {

            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                //LOG.info("" + evt);
                if ("editValid".equals(evt.getPropertyName())) {
                    if (Boolean.FALSE.equals(evt.getNewValue())) {
                        SpinnerNumberModel model = (SpinnerNumberModel) Position.getModel();  

                        ((JSpinner.DefaultEditor)Position.getEditor()).getTextField().setBackground(Color.RED);
                        ((JSpinner.DefaultEditor)Position.getEditor()).getTextField().setToolTipText("Amount must be in range [ " + model.getMinimum() + " ... " + model.getMaximum() + " ] for this symbol");

                    }
                    else{
                        ((JSpinner.DefaultEditor)Position.getEditor()).getTextField().setBackground(Color.WHITE);
                    }
                }

            }
        });
final JSpinner spin2 = new JSpinner();
spin2.setModel(new SpinnerNumberModel(10, 10, 100, 1));

JComponent comp = spin2.getEditor();
JFormattedTextField field = (JFormattedTextField) comp.getComponent(0);
DefaultFormatter formatter = (DefaultFormatter) field.getFormatter();
formatter.setCommitsOnValidEdit(true);


((JSpinner.DefaultEditor)spin2.getEditor()).getTextField().getDocument().addDocumentListener(new DocumentListener() {
          public void changedUpdate(DocumentEvent e) {
                warn();
              }
              public void removeUpdate(DocumentEvent e) {
                warn();
              }
              public void insertUpdate(DocumentEvent e) {
                warn();
              }

              public void warn() {
                  int stringValue = Integer.parseInt(((JSpinner.DefaultEditor)spin2.getEditor()).getTextField().getText());
                  JOptionPane.showMessageDialog(null,
                          "VALS: "+spin2.getValue(), "Error Massage",
                          JOptionPane.ERROR_MESSAGE);
                 if (stringValue<10 || stringValue >100){
                   JOptionPane.showMessageDialog(null,
                      "Error: Please enter number bigger than 0", "Error Massage",
                      JOptionPane.ERROR_MESSAGE);
                 }

              }
            });
public void warn() {
    String text = ((JSpinner.DefaultEditor)spin2.getEditor()).getTextField().getText();
    if (text != null && !text.trim().isEmpty()) {
        try {
            int stringValue = Integer.parseInt(text);
            JOptionPane.showMessageDialog(null,
                  "VALS: "+spin2.getValue(), "Error Massage",
                  JOptionPane.ERROR_MESSAGE);
            if (stringValue<10 || stringValue >100){
            JOptionPane.showMessageDialog(null,
              "Error: Please enter number bigger than 0", "Error Massage",
              JOptionPane.ERROR_MESSAGE);
            }
        } catch (NumberFormatException exp) {
            exp.printStackTrace();
        }
    }
}
field.addPropertyChangeListener(new PropertyChangeListener() {

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        LOG.info("" + evt);
        if ("editValid".equals(evt.getPropertyName()) 
            &&  Boolean.FALSE.equals(evt.getNewValue())) {
          SpinnerNumberModel model = (SpinnerNumberModel) spin2.getModel();  
          JOptionPane.showMessageDialog(null,
          "Error: Number must be in range [" + model.getMinimum() + " ..." + model.getMaximum() + "]",
           "Error Massage",
          JOptionPane.ERROR_MESSAGE);

        }

    }
});
`public class CustomNumberEditor extends JSpinner.NumberEditor {
    public CustomNumberEditor( JSpinner spinner ) {
        super( spinner );
        ((DefaultFormatter ) ((JFormattedTextField) getComponent( 0 )).getFormatter()).setCommitsOnValidEdit( true );
    }
    @Override public void propertyChange(PropertyChangeEvent e) {
        super.propertyChange( e );
        if( e.getPropertyName().equals( "value" ) )
            doStuff( (int) e.getNewValue() );
    }
    private void doStuff( int value )
    {
        //do stuff
    }
}`
_quantitySpinner.setEditor(new CustomNumberEditor(_quantitySpinner));