我先要创建一个滑块,旁边有个文本框,想要滑块的值与文本框内的值统一,就分别为这两个组件添加了事件,可是有异常,大家来给看看,谢谢啦
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;public class MyWhy {
private JFrame frame;
private JSlider js;
private JTextField field;
public MyWhy(){
frame=new JFrame();
js=new JSlider(0,255);
field=new JTextField("127",3);
}
public void init(){
frame.add(js,BorderLayout.NORTH);
frame.add(field,BorderLayout.CENTER);
addActionHandle();//添加事件
frame.pack();
frame.setDefaultCloseOperation(3);
frame.setVisible(true);
}
public void addActionHandle(){
//为滑块添加事件
js.addChangeListener(new ChangeListener(){ @Override
public void stateChanged(ChangeEvent e) {
field.setText(String.valueOf(js.getValue()));
}
});
//为文本框添加事件
field.getDocument().addDocumentListener(new DocumentListener(){ @Override
public void changedUpdate(DocumentEvent e) {
js.setValue(Integer.parseInt(field.getText()));
}
@Override
public void insertUpdate(DocumentEvent e) {
js.setValue(Integer.parseInt(field.getText()));
}
@Override
public void removeUpdate(DocumentEvent e) {
js.setValue(Integer.parseInt(field.getText()));
}
});
}
public static void main(String[] args){
new MyWhy().init();
}
}
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;public class MyWhy {
private JFrame frame;
private JSlider js;
private JTextField field;
public MyWhy(){
frame=new JFrame();
js=new JSlider(0,255);
field=new JTextField("127",3);
}
public void init(){
frame.add(js,BorderLayout.NORTH);
frame.add(field,BorderLayout.CENTER);
addActionHandle();//添加事件
frame.pack();
frame.setDefaultCloseOperation(3);
frame.setVisible(true);
}
public void addActionHandle(){
//为滑块添加事件
js.addChangeListener(new ChangeListener(){ @Override
public void stateChanged(ChangeEvent e) {
field.setText(String.valueOf(js.getValue()));
}
});
//为文本框添加事件
field.getDocument().addDocumentListener(new DocumentListener(){ @Override
public void changedUpdate(DocumentEvent e) {
js.setValue(Integer.parseInt(field.getText()));
}
@Override
public void insertUpdate(DocumentEvent e) {
js.setValue(Integer.parseInt(field.getText()));
}
@Override
public void removeUpdate(DocumentEvent e) {
js.setValue(Integer.parseInt(field.getText()));
}
});
}
public static void main(String[] args){
new MyWhy().init();
}
}
把你的代码里的所有@Override都去掉~~
你用的jdk应该是JDK1.5或以下,Override是一个er annotation类型,它被用作标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们使用了这种annotation在一个没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。
使用 Java 1.5 不能在 implement 某個 interface method 時使用 @Override annotation,使用 Java 1.6 可以
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;public class MyWhy {
private JFrame frame;
private JSlider js;
private JTextField field; public MyWhy() {
frame = new JFrame();
js = new JSlider(0, 255);
field = new JTextField("127", 3); } public void init() {
frame.add(js, BorderLayout.NORTH);
frame.add(field, BorderLayout.CENTER);
addActionHandle();// 添加事件
frame.pack();
frame.setDefaultCloseOperation(3);
frame.setVisible(true);
} public void addActionHandle() {
// 为滑块添加事件
js.addChangeListener(new ChangeListener() { @Override
public void stateChanged(ChangeEvent e) {
field.setText(String.valueOf(js.getValue()));
} });
// 为文本框添加事件
field.getDocument().addDocumentListener(new DocumentListener() { @Override
public void changedUpdate(DocumentEvent e) {
//System.out.println(field.getText());
js.setValue(Integer.parseInt(field.getText()));
} @Override
public void insertUpdate(DocumentEvent e) {
//System.out.println(field.getText());
js.setValue(Integer.parseInt(field.getText()));
} @Override
public void removeUpdate(DocumentEvent e) {
//System.out.println(field.getText());
//js.setValue(Integer.parseInt(field.getText()));
} });
} public static void main(String[] args) {
new MyWhy().init();
}
}这样就行了
回3楼:还不行,跟以前一样啊,滑块移动的时候还报异常
@Override
public void removeUpdate(DocumentEvent e) {
//System.out.println(field.getText());
//js.setValue(Integer.parseInt(field.getText()));
}
按照三楼的应该可以了呀,把那句注释上~~
//为文本框添加事件
field.getDocument().addDocumentListener(new DocumentListener(){ @Override
public void changedUpdate(DocumentEvent e) {
js.setValue(Integer.parseInt(field.getText()));
} @Override
public void insertUpdate(DocumentEvent e) {
js.setValue(Integer.parseInt(field.getText()));
} @Override
public void removeUpdate(DocumentEvent e) {
js.setValue(Integer.parseInt(field.getText()));
} });
} public static void main(String[] args){
new MyWhy().init();
}
//为文本框添加事件
field.getDocument().addDocumentListener(new DocumentListener(){ @Override
public void changedUpdate(DocumentEvent e) {
js.setValue(Integer.parseInt(field.getText()));
} @Override
public void insertUpdate(DocumentEvent e) {
js.setValue(Integer.parseInt(field.getText()));
} @Override
public void removeUpdate(DocumentEvent e) {
js.setValue(Integer.parseInt(field.getText()));
} });
删掉就好了,呵呵。我觉得滑块值是你自己移动的时候就确定了,只需要设定一下文本的显示值就行了,没有必要返回给滑块。