求教一个和java swing 中的spinner有关的难题
大家好,小弟在用JavaSwing编程的时候遇到这样一个问题,由于我想使用spinner组件(就是那个左边是文本区,右边有一上一下两个箭头,代码如下:jSpinner1=...
大家好,小弟在用Java Swing 编程的时候遇到这样一个问题,由于我想使用spinner组件(就是那个左边是文本区,右边有一上一下两个箭头,代码如下:
jSpinner1 = new javax.swing.JSpinner();
jSpinner1.setModel(new javax.swing.SpinnerNumberModel(2, 2, 100, 1));
就是设置最大值为100,最小值为2,初使值为2,每点一下小箭头,值加(减)1.
我希望程可以实现如下功能:
允许用户可以输入无效的值(大于100,小于2,或者为非数字)这个我知道怎么实现
JFormattedTextField ftf = editor.getTextField();
JFormattedTextField.AbstractFormatter formatter = ftf.getFormatter();
DefaultFormatter df = (DefaultFormatter)formatter;
df.setAllowsInvalid(true);
但是问题来了,程序允许用户输入无效的值,但是当用户输完后,程序又自动把那个无效的值改回默认值(本例中自动改为2),我需要的是比如用户输入一个无效值(比如字母a),程序会显示一个messagebox,说输入的值为非数字,无效,并在那个上下箭头左边的文本区把值改回默认值。当用户输入一个不在2和100之间的数字,程序会显示另一个messagebox,说输入的值不在所定义的区间,无效,并在文本区把值改回默认值。
我在一些国外网上看到有人说(以netbeans IDE 为例)在spinner的属性里面改inputVerifier 和editor,我也按了他们的方法做,但是似乎没什么效果(PS,或者我水平不够)。求高手解决! 展开
jSpinner1 = new javax.swing.JSpinner();
jSpinner1.setModel(new javax.swing.SpinnerNumberModel(2, 2, 100, 1));
就是设置最大值为100,最小值为2,初使值为2,每点一下小箭头,值加(减)1.
我希望程可以实现如下功能:
允许用户可以输入无效的值(大于100,小于2,或者为非数字)这个我知道怎么实现
JFormattedTextField ftf = editor.getTextField();
JFormattedTextField.AbstractFormatter formatter = ftf.getFormatter();
DefaultFormatter df = (DefaultFormatter)formatter;
df.setAllowsInvalid(true);
但是问题来了,程序允许用户输入无效的值,但是当用户输完后,程序又自动把那个无效的值改回默认值(本例中自动改为2),我需要的是比如用户输入一个无效值(比如字母a),程序会显示一个messagebox,说输入的值为非数字,无效,并在那个上下箭头左边的文本区把值改回默认值。当用户输入一个不在2和100之间的数字,程序会显示另一个messagebox,说输入的值不在所定义的区间,无效,并在文本区把值改回默认值。
我在一些国外网上看到有人说(以netbeans IDE 为例)在spinner的属性里面改inputVerifier 和editor,我也按了他们的方法做,但是似乎没什么效果(PS,或者我水平不够)。求高手解决! 展开
展开全部
这个可以实现的阿,你只要去掉那个焦点事件,而对,而添加对该自设按钮的监听事件,将焦点监听事件中的代码已过去就行了,改一下就可以了:
如下
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class TestSpinner extends JFrame implements ChangeListener,
FocusListener, ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private JSpinner spinner = new JSpinner();
JTextField editor = new JTextField(10);
private int defaultValue = 2;
public TestSpinner() {
JPanel panel = new JPanel(new FlowLayout());
SpinnerModel model = new SpinnerNumberModel(3, 2, 100, 1);
spinner.setModel(model);
spinner.addChangeListener(this);
editor.addFocusListener(this);
editor.setText("" + defaultValue);
spinner.setEditor(editor);
panel.add(spinner);
JTextField tf = new JTextField(10);
panel.add(tf);
JButton btn = new JButton("click me to test the spinner");
btn.addActionListener(this);
panel.add(btn);
this.add(panel);
this.setSize(300, 300);
this.setVisible(true);
}
public static void main(String[] args) {
new TestSpinner();
}
public void stateChanged(ChangeEvent e) {
SpinnerNumberModel dateModel = (SpinnerNumberModel) spinner.getModel();
Number number = dateModel.getNumber();
editor.setText("" + number);
}
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void focusLost(FocusEvent e) {
}
private boolean isValid(String value) {
int tmp = 1000;
try {
tmp = Integer.parseInt(value);
} catch (NumberFormatException e) {
return false;
}
if (tmp >= 2 && tmp < 101)
return true;
return false;
}
private void setDefaultValue() {
editor.setText("" + defaultValue);
}
@Override
public void actionPerformed(ActionEvent e) {
String value = editor.getText();
if (!isValid(value)) {
JOptionPane.showMessageDialog(null, "你输入的不是合法数字!!!");
setDefaultValue();
}
}
}
如下
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class TestSpinner extends JFrame implements ChangeListener,
FocusListener, ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private JSpinner spinner = new JSpinner();
JTextField editor = new JTextField(10);
private int defaultValue = 2;
public TestSpinner() {
JPanel panel = new JPanel(new FlowLayout());
SpinnerModel model = new SpinnerNumberModel(3, 2, 100, 1);
spinner.setModel(model);
spinner.addChangeListener(this);
editor.addFocusListener(this);
editor.setText("" + defaultValue);
spinner.setEditor(editor);
panel.add(spinner);
JTextField tf = new JTextField(10);
panel.add(tf);
JButton btn = new JButton("click me to test the spinner");
btn.addActionListener(this);
panel.add(btn);
this.add(panel);
this.setSize(300, 300);
this.setVisible(true);
}
public static void main(String[] args) {
new TestSpinner();
}
public void stateChanged(ChangeEvent e) {
SpinnerNumberModel dateModel = (SpinnerNumberModel) spinner.getModel();
Number number = dateModel.getNumber();
editor.setText("" + number);
}
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void focusLost(FocusEvent e) {
}
private boolean isValid(String value) {
int tmp = 1000;
try {
tmp = Integer.parseInt(value);
} catch (NumberFormatException e) {
return false;
}
if (tmp >= 2 && tmp < 101)
return true;
return false;
}
private void setDefaultValue() {
editor.setText("" + defaultValue);
}
@Override
public void actionPerformed(ActionEvent e) {
String value = editor.getText();
if (!isValid(value)) {
JOptionPane.showMessageDialog(null, "你输入的不是合法数字!!!");
setDefaultValue();
}
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询