代码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的问题:
为什么这段代码一运行就抛出空指针异常?

解决方案 »

  1.   

    好久没接触java了不知道说的对不对,不要见笑第一个问题应该是你没有判断e.getSource()取出触发事件的对象
      

  2.   

    貌似两个问题就是加这么一句:if(ie.getSource()==l) {
         l.setText("pp");       
            }
      

  3.   

    问题1:
    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() 方法。
      

  4.   

    代码1:
    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 后面
      

  5.   

    很感谢你的帮忙,
    但很遗憾,并不是这样的:我添加ItemListener接口的控件
    是JComboBox,对象名jcb;
    而不是Label,对象名l;因此加判断的话,
    应该是这样加:
    if(ie.getSource()==jcb){
      ......
    }然而,加上了这句,问题依旧,
    还是谢谢你,
    请帮忙再想想...
      

  6.   

    第一个问题解决方法这样写
    public void itemStateChanged(ItemEvent e) {
    JComboBox jc=(JComboBox)e.getSource();
    if(e.getStateChange()==ItemEvent.SELECTED){
    //对被选中的Item进行操作
            l.setText("pp");
            System.out.println("ok");}
    }
      

  7.   

    重贴一下
    public void itemStateChanged(ItemEvent e) {
                     if(e.getStateChange()==ItemEvent.SELECTED){
                    //对被选中的Item进行操作
            l.setText("pp");
            System.out.println("ok");}                
    }
      

  8.   

    l=new Label("my gad!"); 
            jcb.addItemListener(this):
    当红色的这段代码在new labe 前面,当jcb事件发生时即执行l.setText()方法时它是找不到Label对象的
    因为此时Label对象不存在。
    这样?