JSpinners慢慢否认价值修改

时间:2015-08-31 14:45:59

标签: java swing jspinner

在我的挥杆程序中,我有31个JSpinner,没有修改(JSpinner spinner = new JSpinner();)。当我运行我的程序并且我手动将值写入JSpinners的值字段时,我写入值的JSpinner越多,我就越不能再写了。例如,在前三个或四个JSpinner中,我可以写4个数字,然后它允许我只写3,然后是2,然后是1,最后我甚至不能再写了。

这是关于微调器的代码:

static JSpinner[] spinners = new JSpinner[31];
...
spinners[i]= new JSpinner();
if(i==0)
   spinners[i].setEnabled(false);
spinners[i].setValue(0);
spinners[i].setName(Integer.toString(i)); //"i" is a "for" counter
spinners[i].setBorder(BorderFactory.createLineBorder(Color.BLACK,1));
((JSpinner.NumberEditor)spinners[i].getEditor()).
          getTextField().setBackground(Color.decode("#ababab"));
((JSpinner.NumberEditor)spinners[i].getEditor()).
          getTextField().setForeground(Color.BLACK);
          spinners[i].setUI(new MyUI());

JComponent comp = spinners[i].getEditor();
JFormattedTextField field = (JFormattedTextField) comp.getComponent(0);
DefaultFormatter formatter = (DefaultFormatter) field.getFormatter();
formatter.setCommitsOnValidEdit(true);

删除formatter.setCommitsOnValidEdit(true);这样做,如果我写了一个类似11500的值,则返回上一个值(例如0),因此对它来说它不是一个有效值,即使它是&#39 ; s是一个int。

MyUI()修改了按钮的功能,在修改JSpinner值时修改了JLabel的文本。

This is a screenshot of what happens

正如您所看到的,我能够在第一个JSpinner中写入4位数字,然后我只能在其中一些数字上写入3,然后在其他部分中写入0或1。

互联网上没有任何相关内容,是否有人有过这个问题的经验?感谢。

1 个答案:

答案 0 :(得分:2)

很难说出现问题的地方,但我真的怀疑这样调用setUI()。解决问题的一种方法是重新设计代码以创建一个隔离的,带标签的微调器并将其添加到布局中。

在此示例中,我使用setColumns()使每个微调器在GridLayout中具有相同的大小。在最后一个微调器中输入数字我没有遇到任何麻烦。

image

private static final int N = 31;
…
List<JSpinner> list = new ArrayList<>();
JPanel p = new JPanel(new GridLayout(N, 0));
for (int i = 0; i < N; i++) {
    p.add(createSpinnerPanel(list, i));
}
…
private JPanel createSpinnerPanel(List<JSpinner> list, int i) {
    JSpinner s = new JSpinner();
    list.add(s);
    JFormattedTextField f = (JFormattedTextField) s.getEditor().getComponent(0);
    f.setColumns(4);
    JPanel p = new JPanel(new GridLayout(0, 2));
    p.add(new JLabel("Label " + String.valueOf(i + 1) + ": ", JLabel.RIGHT));
    p.add(s);
    return p;
}