Добавление ActionListener в JComboBox без элементов не работает - PullRequest
0 голосов
/ 04 февраля 2010

Ниже приведен исходный код для 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 ]

4 голосов
/ 04 февраля 2010

Все работает нормально, слушатель правильно добавлен в JComboBox.

Дело в том, что когда вы вызываете addItem для comboBox, вызывается событие contentsChanged и вызывается ваш метод test # actionPerformed, который пытается

l.setText(str);

Но l - это JLabel, который инициализируется ПОСЛЕ цикла cb.addItem.Поэтому, когда обработчик события называется l, он по-прежнему равен нулю, поэтому исключение NullPointerException.

2 голосов
/ 04 февраля 2010

Запустив ваш код, я получаю исключение NullPointerException относительно вашего JLabel.Это не было инициализировано к моменту первого вызова ActionListener - когда вы добавляете свой первый элемент, добавляется выбор и, следовательно, изменяется.

1 голос
/ 04 февраля 2010
0 голосов
/ 04 февраля 2010

Реализация ActionListener, как вы делаете, не является общим шаблоном.

Вы должны лучше написать что-то вроде:

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

  if((JComboBox)ae.getSource()).getSelectedItem() != null){
   //Do your stuff
  }
 }
});
0 голосов
/ 04 февраля 2010

Вместо этого вы можете попробовать добавить ItemListener.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...