Java 如何使用DefaultEditor方法检查JSpinner字段上的手动编辑
我从这里改编代码: 编辑2 当我按下向上微调器箭头时,以下代码为我提供了一个无限循环的对话框: 字符串: 字符串:10 VAL:10 字符串: 字符串:10 VAL:10 字符串: 字符串:10 VAL:10 警告:您将需要使用taskmanager来杀死它Java 如何使用DefaultEditor方法检查JSpinner字段上的手动编辑,java,swing,jspinner,Java,Swing,Jspinner,我从这里改编代码: 编辑2 当我按下向上微调器箭头时,以下代码为我提供了一个无限循环的对话框: 字符串: 字符串:10 VAL:10 字符串: 字符串:10 VAL:10 字符串: 字符串:10 VAL:10 警告:您将需要使用taskmanager来杀死它 public static void main(String[] args) { // TODO Auto-generated method stub JFrame F = new JFrame();
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);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
原始问题
但若我使用微调器来输入低于下限的值。我在文本字段中得到一个“(”,此错误:
线程“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.HandlerMemove(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.PumpeEventsforFilter(EventDispatchThread.java:161)
位于java.awt.EventDispatchThread.PumpeEventsforHierarchy(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(新喷丝头编号模型(10,10,100,1));
JComponent comp=spin2.getEditor();
JFormattedTextField=(JFormattedTextField)组件getComponent(0);
DefaultFormatter formatter=(DefaultFormatter)字段。getFormatter();
setCommitsonValidIt(true);
((JSpinner.DefaultEditor)spin2.getEditor()).getTextField().getDocument().addDocumentListener(新DocumentListener()){
公共作废更改日期(记录事件e){
警告();
}
公共作废移除更新(文档事件e){
警告();
}
公共作废插入更新(文档事件e){
警告();
}
公开无效警告(){
int stringValue=Integer.parseInt(((JSpinner.DefaultEditor)spin2.getEditor()).getTextField().getText());
JOptionPane.showMessageDialog(null,
“VAL:+spin2.getValue(),“错误信息”,
JOptionPane.ERROR\u消息);
如果(字符串值100){
JOptionPane.showMessageDialog(null,
“错误:请输入大于0的数字”,“错误信息”,
JOptionPane.ERROR\u消息);
}
}
});
异常说明传递给Integer.parseInt(..)
的字符串是空字符串。因此,在传递给Integer.parseInt(..)之前,请确保检查((JSpinner.DefaultEditor)spin2.getEditor()).getTextField().getText()
是否为null和空。
您可以看看apache commons io和StringUtils类,它们有很多很好的方法来减轻检查空/空字符串的痛苦例外情况是,传递给
Integer.parseInt(…)
的字符串是空字符串。因此请确保检查((JSpinner.DefaultEditor)spin2.getEditor)
((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);
}
}
}
});
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);
}
}
});
public void warn() {
String text = ((JSpinner.DefaultEditor)spin2.getEditor()).getTextField().getText();
if (text != null && !text.trim().isEmpty()) {
try {
int stringValue = Integer.parseInt(text);
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);
}
} catch (NumberFormatException exp) {
exp.printStackTrace();
}
}
}
field.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
LOG.info("" + evt);
if ("editValid".equals(evt.getPropertyName())
&& Boolean.FALSE.equals(evt.getNewValue())) {
SpinnerNumberModel model = (SpinnerNumberModel) spin2.getModel();
JOptionPane.showMessageDialog(null,
"Error: Number must be in range [" + model.getMinimum() + " ..." + model.getMaximum() + "]",
"Error Massage",
JOptionPane.ERROR_MESSAGE);
}
}
});
`public class CustomNumberEditor extends JSpinner.NumberEditor {
public CustomNumberEditor( JSpinner spinner ) {
super( spinner );
((DefaultFormatter ) ((JFormattedTextField) getComponent( 0 )).getFormatter()).setCommitsOnValidEdit( true );
}
@Override public void propertyChange(PropertyChangeEvent e) {
super.propertyChange( e );
if( e.getPropertyName().equals( "value" ) )
doStuff( (int) e.getNewValue() );
}
private void doStuff( int value )
{
//do stuff
}
}`
_quantitySpinner.setEditor(new CustomNumberEditor(_quantitySpinner));