将ActionListener添加到JComboBox而不使用任何项

时间:2010-02-04 06:05:43

标签: java swing jcombobox

以下是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() ;
 }
}

5 个答案:

答案 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)

ComboBoxDemo中有一个很好的How to Use Combo Boxes

答案 3 :(得分:0)

您可能想尝试添加ItemListener。

答案 4 :(得分:0)

执行ActionListener并不是一种常见的模式。

你应该更好地编写代码:

cb.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent ae){

  if((JComboBox)ae.getSource()).getSelectedItem() != null){
   //Do your stuff
  }
 }
});