您
JFormattedTextField
正确的实现不正确JSpinner
,您有实现documentFilter
用于过滤从keyboadChars
输入或从ClipBoard粘贴的un_wanted的工具,(感谢@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() { }}


