2012-03-19 16 views
3

我试图使JSpinner只接受数字,但我也希望它读取/响应退格。使JSpinner只读取数字,但也检测退格

public class test { 
    JFrame frame; 
    JPanel panel; 
    JSpinner spinner; 

    public test() 
    { 
     frame = new JFrame("test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setPreferredSize(new Dimension(200,200)); 

     panel = new JPanel(); 

     SpinnerNumberModel numSpin = new SpinnerNumberModel(10, 0,1000,1); 
     spinner = new JSpinner(numSpin); 
     JFormattedTextField txt = ((JSpinner.NumberEditor) spinner.getEditor()).getTextField(); 
     ((NumberFormatter) txt.getFormatter()).setAllowsInvalid(false); 
     panel.add(spinner); 

     frame.setContentPane(panel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 

    } 
    public static void main(String[] args) 

    { 
     test test = new test(); 
    } 
} 

上面的代码仅用于制作数字,但这不允许我退格。我发现这个网站的一些例子,但他们写的C.

+0

请学习Java命名约定并严格遵守 – kleopatra 2012-03-20 11:21:43

+0

@kleopatra请KY – 2013-04-11 18:24:07

回答

11
  • 你是对的JFormattedTextField未正确实施JSpinner,你有工具DocumentFilter从keyboad输入或从剪贴板粘贴的un_wanted Chars过滤, (感谢@StanislavL)

  • 你有selectAll()focusGained()裹成invokeLater()自己的问题解决了,

例如

import java.awt.BorderLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JSpinner; 
import javax.swing.SpinnerNumberModel; 
import javax.swing.SwingUtilities; 
import javax.swing.text.*; 

public class TestDigitsOnlySpinner { 

    public static void main(String... args) { 
     SwingUtilities.invokeLater((Runnable) new Runnable() { 

      @Override 
      public void run() { 
       JFrame frame = new JFrame("enter digit"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       JSpinner jspinner = makeDigitsOnlySpinnerUsingDocumentFilter(); 
       frame.getContentPane().add(jspinner, BorderLayout.CENTER); 
       frame.getContentPane().add(new JButton("just another widget"), BorderLayout.SOUTH); 
       frame.pack(); 
       frame.setVisible(true); 
      } 

      private JSpinner makeDigitsOnlySpinner_BasicAttempt() { 
       JSpinner spinner = new JSpinner(new SpinnerNumberModel()); 
       return spinner; 
      } 

      private JSpinner makeDigitsOnlySpinnerUsingDocumentFilter() { 
       JSpinner spinner = new JSpinner(new SpinnerNumberModel(0, 0, 20, 1)); 
       JSpinner.NumberEditor jsEditor = (JSpinner.NumberEditor) spinner.getEditor(); 
       final Document jsDoc = jsEditor.getTextField().getDocument(); 
       if (jsDoc instanceof PlainDocument) { 
        AbstractDocument doc = new PlainDocument() { 

         private static final long serialVersionUID = 1L; 

         @Override 
         public void setDocumentFilter(DocumentFilter filter) { 
          if (filter instanceof MyDocumentFilter) { 
           super.setDocumentFilter(filter); 
          } 
         } 
        }; 
        doc.setDocumentFilter(new MyDocumentFilter()); 
        jsEditor.getTextField().setDocument(doc); 
       } 
       return spinner; 
      } 
     }); 
    } 

    private static class MyDocumentFilter extends DocumentFilter { 

     @Override 
     public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException { 
      if (stringContainsOnlyDigits(string)) { 
       super.insertString(fb, offset, string, attr); 
      } 
     } 

     @Override 
     public void remove(FilterBypass fb, int offset, int length) throws BadLocationException { 
      super.remove(fb, offset, length); 
     } 

     @Override 
     public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { 
      if (stringContainsOnlyDigits(text)) { 
       super.replace(fb, offset, length, text, attrs); 
      } 
     } 

     private boolean stringContainsOnlyDigits(String text) { 
      for (int i = 0; i < text.length(); i++) { 
       if (!Character.isDigit(text.charAt(i))) { 
        return false; 
       } 
      } 
      return true; 
     } 
    } 

    private TestDigitsOnlySpinner() { 
    } 
} 
+0

没错工作谢谢:)一个简单的问题,你会怎么做光标出现后的数字,因此更容易退格? – 2012-03-20 02:46:53

+0

是否可以设置JSpinner中字符数量的限制。例如最多3个数字,所以您可以手动输入的最大数字是999. – 2012-03-20 23:22:25

+0

是的,这很简单,因为这个原因,SpinnerNumberModel中的定义是'JSpinner spinner = new JSpinner(new SpinnerNumberModel(0,0,999,1 ));' – mKorbel 2012-03-20 23:26:00

相关问题