以下是UseTest.java
的源代码。为什么不起作用?
import javax.swing.* ;
import java.awt.* ;
import java.awt.event.* ;
class Test implements ActionListener{
JFrame f ;
JPanel p ;
JComboBox cb ;
JLabel l ;
Test(){
f = new JFrame("Test") ;
f.setSize(200, 200) ;
p = new JPanel() ;
p.setLayout(new GridLayout(2, 1)) ;
cb = new JComboBox() ;
cb.addActionListener(this) ;
for(int i = 1 ; i <= 20 ; i++)
cb.addItem(i + "") ;
//cb.addActionListener(this) ; //doesn't throws exception here
l = new JLabel() ;
l.setForeground(Color.red) ;
p.add(l) ;
p.add(cb) ;
f.add(p) ;
f.setVisible(true) ;
}
public void actionPerformed(ActionEvent ae){
if(cb.getSelectedItem() != null){
display() ;
}
}
private void display(){
String str = "" ;
str = "Combo selection changed to : " + cb.getSelectedItem() ;
l.setText(str) ;
System.out.println(str);
}
}
public class UseTest{
public static void main(String args[]){
Test t = new Test() ;
}
}
答案 0 :(得分:4)
一切正常,侦听器正确添加到JComboBox。
问题是当你向comboBox调用addItem时,会触发contentsChanged事件,并且会调用test#actionPerformed方法尝试执行
l.setText(str);
但是l是在cb.addItem循环之后初始化的JLabel。因此,当调用事件处理程序时,l仍为null,因此为NullPointerException。
答案 1 :(得分:2)
运行代码,我得到一个与JLabel相关的NullPointerException。首次调用ActionListener时尚未初始化 - 添加第一个项目时会添加,因此更改选择。
答案 2 :(得分:1)
答案 3 :(得分:0)
您可能想尝试添加ItemListener。
答案 4 :(得分:0)
执行ActionListener并不是一种常见的模式。
你应该更好地编写代码:
cb.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
if((JComboBox)ae.getSource()).getSelectedItem() != null){
//Do your stuff
}
}
});