【问题标题】:Avoiding JSpinner to take letters避免 JSpinner 取信
【发布时间】:2012-10-10 18:08:15
【问题描述】:

我有一个jSpinner 和一个SpinnerNumberModel,如下所示:

spinnerModelFix = new SpinnerNumberModel(0, 0, 65535, 1);
JSpinner fixedValueSpinner = new JSpinner(spinnerModelFix);

我只想在微调器中显示整数,这样如果用户插入字母,它们就不会显示出来。

我认为我应该 extends SpinnerNumberModeloverride fireStateChanged() 方法...

但我不确定我需要在该方法中做什么。

谁能给我一些提示?

【问题讨论】:

    标签: java swing jspinner


    【解决方案1】:
    • 是的,解决方法很简单,

    • 有两种方法,必须从JSpinner派生JTextFieldJFormattedTextField

    • 然后添加

      a)DocumentListener

      b)DocumentFilter

    我认为DocumentFilter is easiest for code workaround, better, maybe safer的用法

    【讨论】:

    • @Max 这个想法的作者是 JTextComponents 之王
    • 这可行,但是当显示的值高于 1000 时,增加或减少该值的箭头不再起作用...您知道可能是什么问题吗?
    • 在 SpinnerNimberModel 中的aaach:-),有四个值,其中两个是最小值和最大值:-)
    • 我改成了new SpinnerNumberModel(0, 0, 65535, 1),但还是没有解决问题...
    【解决方案2】:

    您可以在微调器的格式化程序上尝试setAllowsInvalid(false)。例如:

    SpinnerNumberModel spinnerModelFix = new SpinnerNumberModel(0, 0, 65535, 1);
    JSpinner fixedValueSpinner = new JSpinner(spinnerModelFix);
    JFormattedTextField textField = ((JSpinner.NumberEditor) fixedValueSpinner
            .getEditor()).getTextField();
    ((NumberFormatter) textField.getFormatter()).setAllowsInvalid(false);
    

    【讨论】:

    • 这似乎或多或少有效,但如果我愿意,它不会让我删除所有数字。它需要至少有一位数字...
    • @mKorbel 建议的@amp DocumentFilter 可能更适合您的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 2011-04-07
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多