我有一个使用JSpinner
且使用SpinnerNumberModel
值的double
的GUI。
更改Editor
的JSpinner
的内容后,我希望背景更改为黄色(以显示当前显示的值不是JSpinner
或“ 。
如果该内容无效(例如,超出了我的Model
指定的允许范围或文本为“ abc”的范围),则背景应更改为红色。
我已经尝试通过SpinnerNumberModel
实现我想要的功能,但是并没有成功,而且我不确定它是否仍然可以正常工作,因为我需要检查聚焦和散焦之间的内容。
我检查了Tutorials中是否存在FocusListener
组件的所有Listeners
,但是找不到适合该工作的正确的教程。 (here I informed myself)
我是Swing
概念的新手,非常感谢能帮助我更进一步解决问题的任何帮助,但同时也有助于总体了解Listeners
以及如何在这种情况下更好地使用它们!
我真正的基本代码示例,其中提到了使用焦点侦听器的不良尝试:
public class test implements FocusListener{
JFrame frame;
SpinnerNumberModel model;
JSpinner spinner;
JComponent comp;
JFormattedTextField field;
public test() {
JFrame frame = new JFrame("frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
model = new SpinnerNumberModel(0., 0., 100., 0.1);
spinner = new JSpinner(model);
comp = spinner.getEditor();
field = (JFormattedTextField) comp.getComponent(0);
field.addFocusListener(this);
frame.getContentPane().add(spinner);
frame.getContentPane().add(new JButton("defocus spinner")); //to have something to defocus when testing :)
frame.pack();
frame.setVisible(true);
}
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
//when the values of the field and the spinner don't match, the field should get yellow
if(!field.getValue().equals(spinner.getModel().getValue())) {
field.setBackground(Color.YELLOW);
}
}
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
//if they match again, reset to white
if(!field.getValue().equals(spinner.getModel().getValue())) {
field.setBackground(Color.RED);
}
}
}
最佳答案
JSpinner使用文本字段作为微调器的编辑器
因此,您可以将DocumentListener
添加到用作编辑器的文本字段的Document
中。
就像是:
JTextField textField = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField());
textField.getDocument.addDocumentListener(...);
然后,当添加/删除文本时,将生成一个DocumentEvent,您可以进行错误检查。阅读有关Listener For Changes on a Document的Swing教程中的部分,以获得更多信息和工作示例。
关于java - 如何根据字段的当前编辑内容更改JSpinner的背景颜色?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44871170/