JSpinners 慢慢拒绝值修改
JSpinners slowly denying value modify
在我的 swing 程序中,我有 31 个 JSpinners,没有修改 (JSpinner spinner = new JSpinner();
)。当我运行我的程序和我去手动写一个值到JSpinners的值字段时,我写值的JSpinners越多,我就越写不下去了。比如前三四个JSpinners我可以写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 这样的值写入 returns 到以前的值(例如 0),那么它不是一个有效值,即使它是一个整数。
MyUI()
修改按钮的作用,它们在修改 JSpinner 值的同时修改 JLabel 的文本。
如您所见,我可以在第一个 JSpinner 中写入 4 位数字,然后我只能在其中一些上写入 3 位,然后在其他中写入 0 或 1 位。
网上没有这方面的资料,有没有人遇到过这个问题?谢谢。
很难说哪里出了问题,但我真的很怀疑这样调用setUI()
。确定问题的一种方法是重构您的代码以创建一个隔离的、带标签的微调器并将其添加到布局中。
在此示例中,我使用 setColumns()
使每个微调器在 GridLayout
中具有相同的大小。我在最后一个微调器中输入数字时没有遇到任何问题。
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;
}
在我的 swing 程序中,我有 31 个 JSpinners,没有修改 (JSpinner spinner = new JSpinner();
)。当我运行我的程序和我去手动写一个值到JSpinners的值字段时,我写值的JSpinners越多,我就越写不下去了。比如前三四个JSpinners我可以写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 这样的值写入 returns 到以前的值(例如 0),那么它不是一个有效值,即使它是一个整数。
MyUI()
修改按钮的作用,它们在修改 JSpinner 值的同时修改 JLabel 的文本。
如您所见,我可以在第一个 JSpinner 中写入 4 位数字,然后我只能在其中一些上写入 3 位,然后在其他中写入 0 或 1 位。
网上没有这方面的资料,有没有人遇到过这个问题?谢谢。
很难说哪里出了问题,但我真的很怀疑这样调用setUI()
。确定问题的一种方法是重构您的代码以创建一个隔离的、带标签的微调器并将其添加到布局中。
在此示例中,我使用 setColumns()
使每个微调器在 GridLayout
中具有相同的大小。我在最后一个微调器中输入数字时没有遇到任何问题。
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;
}