-1

以下はのソースコードです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() ;
 }
}
4

5 に答える 5

4

すべてが正常に機能し、リスナーがJComboBoxに正しく追加されます。

コンボボックスにaddItemを呼び出すと、contentsChangedイベントが発生し、test#actionPerformedメソッドが呼び出されます。

l.setText(str);

ただし、lはcb.addItemループの後に初期化されるJLabelです。したがって、イベントハンドラーが呼び出されても、lはnullのままであるため、NullPointerExceptionが発生します。

于 2010-02-04T06:15:27.223 に答える
2

コードを実行すると、JLabelに関連してNullPointerExceptionが発生します。これは、ActionListenerが最初に呼び出された時点では初期化されていません。追加すると、最初のアイテムが追加され、選択が変更されます。

于 2010-02-04T06:15:41.837 に答える
1

ComboBoxDemoコンボボックスの使い方には良い点があります。

于 2010-02-04T15:23:02.420 に答える
0

代わりにItemListenerを追加してみてください。

于 2010-02-04T06:10:52.820 に答える
0

ActionListenerを実装するのは、一般的なパターンではありません。

次のようなコーディングを行う必要があります。

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

  if((JComboBox)ae.getSource()).getSelectedItem() != null){
   //Do your stuff
  }
 }
});
于 2010-02-04T08:48:28.180 に答える