代码1:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;class xt extends JFrame implements ItemListener{
JComboBox jcb;
Label l;
xt(){
Container cp=getContentPane();
cp.setLayout(new GridLayout(1,2));
String s[]={"aabbcc","AABBCC"};
jcb=new JComboBox(s); jcb.addItemListener(this);
l=new Label("my gad!");
cp.add(jcb);
cp.add(l);
setVisible(true);
setResizable(false);
//setSize(600,500);
pack();
addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent we){
System.exit(0);
}
}
);
}
public void itemStateChanged(ItemEvent ie){
//l.setText("pp");
System.out.println("ok");
}
public static void main(String in[]){
xt xto=new xt();
}
}代码2:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;class xt extends JFrame implements ItemListener{
JComboBox jcb;
Label l;
xt(){
Container cp=getContentPane();
cp.setLayout(new GridLayout(1,2));
//String s[]={"aabbcc","AABBCC"};
jcb=new JComboBox(); jcb.addItemListener(this);
jcb.addItem("aabbcc");
jcb.addItem("AABBCC");
l=new Label("my gad!");
cp.add(jcb);
cp.add(l);
setVisible(true);
setResizable(false);
//setSize(600,500);
pack();
addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent we){
System.exit(0);
}
}
);
}
public void itemStateChanged(ItemEvent ie){
l.setText("pp"); //语句(1)
//System.out.println("ok"); //语句(2)
}
public static void main(String in[]){
xt xto=new xt();
}
}
代码1的问题:
为什么每选择一次,字符串"ok"被打印两次?
代码2的问题:
为什么这段代码一运行就抛出空指针异常?
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;class xt extends JFrame implements ItemListener{
JComboBox jcb;
Label l;
xt(){
Container cp=getContentPane();
cp.setLayout(new GridLayout(1,2));
String s[]={"aabbcc","AABBCC"};
jcb=new JComboBox(s); jcb.addItemListener(this);
l=new Label("my gad!");
cp.add(jcb);
cp.add(l);
setVisible(true);
setResizable(false);
//setSize(600,500);
pack();
addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent we){
System.exit(0);
}
}
);
}
public void itemStateChanged(ItemEvent ie){
//l.setText("pp");
System.out.println("ok");
}
public static void main(String in[]){
xt xto=new xt();
}
}代码2:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;class xt extends JFrame implements ItemListener{
JComboBox jcb;
Label l;
xt(){
Container cp=getContentPane();
cp.setLayout(new GridLayout(1,2));
//String s[]={"aabbcc","AABBCC"};
jcb=new JComboBox(); jcb.addItemListener(this);
jcb.addItem("aabbcc");
jcb.addItem("AABBCC");
l=new Label("my gad!");
cp.add(jcb);
cp.add(l);
setVisible(true);
setResizable(false);
//setSize(600,500);
pack();
addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent we){
System.exit(0);
}
}
);
}
public void itemStateChanged(ItemEvent ie){
l.setText("pp"); //语句(1)
//System.out.println("ok"); //语句(2)
}
public static void main(String in[]){
xt xto=new xt();
}
}
代码1的问题:
为什么每选择一次,字符串"ok"被打印两次?
代码2的问题:
为什么这段代码一运行就抛出空指针异常?
l.setText("pp");
}
itemStateChanged在用户已选定或取消选定某项时调用。为此方法编写的代码将执行需要在已选定(或已取消选定)项时发生的操作。
你每一次选择都发生一次选定和取消事件
问题2:改成这个样子
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;class xt extends JFrame implements ItemListener{
JComboBox jcb;
Label l;
private Object makeObj(final String item) {
return new Object() {
public String toString() {
return item;
}
};
}
xt(){
Container cp=getContentPane();
cp.setLayout(new GridLayout(1,2));
//String s[]={"aabbcc","AABBCC"};
jcb=new JComboBox();
jcb.addItem(makeObj("aabbcc"));
jcb.addItem(makeObj("AABBCC"));
l=new Label("my gad!");
jcb.addItemListener(this);
cp.add(jcb);
cp.add(l);
setVisible(true);
setResizable(false);
//setSize(600,500);
pack();
addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent we){
System.exit(0);
}
}
);
}
public void itemStateChanged(ItemEvent ie){
l.setText("pp"); //语句(1)
//System.out.println("ok"); //语句(2)
}
public static void main(String in[]){
xt xto=new xt();
}
}
因为你的 jcb.addItemListener(this);这句话放在了jcb.addItem前面,所以每次add都触发了这个事件
还有一个问题就是如果添加复制的 String 对象,可能会发生焦点和键盘导航问题。解决方法是,添加新对象而不是 String 对象,并且确保定义了 toString() 方法。
public void itemStateChanged(ItemEvent ie){
//l.setText("pp");
if(ie.getItem()=="aabbcc"){
System.out.println("ok");
}
}
代码2:
l=new Label("my gad!");
jcb.addItemListener(this);
jcb监听放在new Label 后面
但很遗憾,并不是这样的:我添加ItemListener接口的控件
是JComboBox,对象名jcb;
而不是Label,对象名l;因此加判断的话,
应该是这样加:
if(ie.getSource()==jcb){
......
}然而,加上了这句,问题依旧,
还是谢谢你,
请帮忙再想想...
public void itemStateChanged(ItemEvent e) {
JComboBox jc=(JComboBox)e.getSource();
if(e.getStateChange()==ItemEvent.SELECTED){
//对被选中的Item进行操作
l.setText("pp");
System.out.println("ok");}
}
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange()==ItemEvent.SELECTED){
//对被选中的Item进行操作
l.setText("pp");
System.out.println("ok");}
}
jcb.addItemListener(this):
当红色的这段代码在new labe 前面,当jcb事件发生时即执行l.setText()方法时它是找不到Label对象的
因为此时Label对象不存在。
这样?