我正在从这里调整代码:
JTextField 的值更改侦听器
EDIT 2
当我按下向上微调箭头时,以下代码会出现无限循环的对话框:
细绳:
字符串:10
值:10
细绳:
字符串:10
值:10
细绳:
字符串:10
值:10
……
警告您需要使用任务管理器来杀死它。
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame F = new JFrame();
F.setVisible(true);
JPanel p = new JPanel();
final JSpinner spin2 = new JSpinner();
spin2.setModel(new SpinnerNumberModel(10, 10, 100, 1));
JComponent comp = spin2.getEditor();
JFormattedTextField field = (JFormattedTextField) comp.getComponent(0);
DefaultFormatter formatter = (DefaultFormatter) field.getFormatter();
formatter.setCommitsOnValidEdit(true);
((JSpinner.DefaultEditor)spin2.getEditor()).getTextField().getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
warn();
}
public void removeUpdate(DocumentEvent e) {
warn();
}
public void insertUpdate(DocumentEvent e) {
warn();
}
public void warn() {
String text = ((JSpinner.DefaultEditor)spin2.getEditor()).getTextField().getText();
JOptionPane.showMessageDialog(null, "STRING: "+text, "Error Massage", JOptionPane.ERROR_MESSAGE);
if (text != null && !text.trim().isEmpty()) {
int stringValue = Integer.parseInt(((JSpinner.DefaultEditor)spin2.getEditor()).getTextField().getText());
JOptionPane.showMessageDialog(null,
"VALS: "+spin2.getValue(), "Error Massage",
JOptionPane.ERROR_MESSAGE);
if (stringValue<10 || stringValue >100){
JOptionPane.showMessageDialog(null,
"Error: Number outside bounds", "Error Massage",
JOptionPane.ERROR_MESSAGE);
}
}
}
});
p.add(spin2);
F.add(p);
F.pack();
F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
EDIT 3
当无效时,这会将背景更改为红色,但当字段失去焦点时,值会恢复为之前的值(如果无效)。我希望能够在此时放置一个 JOptionPane 说值仍然无效,而不是恢复到以前的状态:
((JSpinner.DefaultEditor)Position.getEditor()).getTextField().addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
//LOG.info("" + evt);
if ("editValid".equals(evt.getPropertyName())) {
if (Boolean.FALSE.equals(evt.getNewValue())) {
SpinnerNumberModel model = (SpinnerNumberModel) Position.getModel();
((JSpinner.DefaultEditor)Position.getEditor()).getTextField().setBackground(Color.RED);
((JSpinner.DefaultEditor)Position.getEditor()).getTextField().setToolTipText("Amount must be in range [ " + model.getMinimum() + " ... " + model.getMaximum() + " ] for this symbol");
}
else{
((JSpinner.DefaultEditor)Position.getEditor()).getTextField().setBackground(Color.WHITE);
}
}
}
});
/////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////
原问题
但是如果我使用微调器输入低于下限的值。我在文本字段中收到一个“(”,并且出现此错误:
线程“AWT-EventQueue-0”中的异常 java.lang.NumberFormatException:对于输入字符串:“”
在 java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
在 java.lang.Integer.parseInt(Integer.java:504)
在 java.lang.Integer.parseInt(Integer.java:527)
在 com.NResearch.ValueAtRisk.Sigma$7.warn(Sigma.java:626)
在 com.NResearch.ValueAtRisk.Sigma$7.removeUpdate(Sigma.java:619)
在 javax.swing.text.AbstractDocument.fireRemoveUpdate(AbstractDocument.java:260)
在 javax.swing.text.AbstractDocument.handleRemove(AbstractDocument.java:623)
在 javax.swing.text.AbstractDocument.remove(AbstractDocument.java:591)
在javax.swing.text.AbstractDocument.replace(AbstractDocument.java:667)
在 javax.swing.text.JTextComponent.setText(JTextComponent.java:1718)
在 javax.swing.JFormattedTextField$AbstractFormatter.install(JFormattedTextField.java:949)
在 javax.swing.text.DefaultFormatter.install(DefaultFormatter.java:124)
在 javax.swing.text.InternationalFormatter.install(InternationalFormatter.java:285)
在 javax.swing.JFormattedTextField.setFormatter(JFormattedTextField.java:465)
在 javax.swing.JFormattedTextField.setValue(JFormattedTextField.java:789)
在 javax.swing.JFormattedTextField.processFocusEvent(JFormattedTextField.java:636)
在 java.awt.Component.processEvent(Component.java:6261)
在 java.awt.Container.processEvent(Container.java:2229)
在 java.awt.Component.dispatchEventImpl(Component.java:4861)
在 java.awt.Container.dispatchEventImpl(Container.java:2287)
在 java.awt.Component.dispatchEvent(Component.java:4687)
在java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1895)
在 java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:938)
在java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:570)
在 java.awt.Component.dispatchEventImpl(Component.java:4731)
在 java.awt.Container.dispatchEventImpl(Container.java:2287)
在 java.awt.Component.dispatchEvent(Component.java:4687)
在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
在 java.awt.EventQueue.access$200(EventQueue.java:103)
在 java.awt.EventQueue$3.run(EventQueue.java:694)
在 java.awt.EventQueue$3.run(EventQueue.java:692)
在 java.security.AccessController.doPrivileged(本机方法)
在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
在 java.awt.EventQueue$4.run(EventQueue.java:708)
在 java.awt.EventQueue$4.run(EventQueue.java:706)
在 java.security.AccessController.doPrivileged(本机方法)
在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
在 java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
在java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
在java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
在java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
在java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
在 java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
final JSpinner spin2 = new JSpinner();
spin2.setModel(new SpinnerNumberModel(10, 10, 100, 1));
JComponent comp = spin2.getEditor();
JFormattedTextField field = (JFormattedTextField) comp.getComponent(0);
DefaultFormatter formatter = (DefaultFormatter) field.getFormatter();
formatter.setCommitsOnValidEdit(true);
((JSpinner.DefaultEditor)spin2.getEditor()).getTextField().getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
warn();
}
public void removeUpdate(DocumentEvent e) {
warn();
}
public void insertUpdate(DocumentEvent e) {
warn();
}
public void warn() {
int stringValue = Integer.parseInt(((JSpinner.DefaultEditor)spin2.getEditor()).getTextField().getText());
JOptionPane.showMessageDialog(null,
"VALS: "+spin2.getValue(), "Error Massage",
JOptionPane.ERROR_MESSAGE);
if (stringValue<10 || stringValue >100){
JOptionPane.showMessageDialog(null,
"Error: Please enter number bigger than 0", "Error Massage",
JOptionPane.ERROR_MESSAGE);
}
}
});