2010-02-04 2 views
-1

다음은 UseTest.java의 소스 코드입니다. 왜 작동하지 않습니까?작동하지 않는 항목이없는 JComboBox에 ActionListener 추가

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

모든 것이 잘 작동하며, 리스너가 JComboBox에 올바르게 추가됩니다.

당신이 콤보 상자에 addItem를 호출 할 때 일이되면, contentsChanged 이벤트가 발사되고 테스트 #이 방법은

l.setText(str); 

을 시도하는 호출의 actionPerformed 그러나 L은 CB 후에 초기화되는 JLabel의입니다 .addItem 루프. 따라서 이벤트 처리기가 호출 될 때 l은 여전히 ​​null이므로 NullPointerException이 발생합니다.

0

대신 ItemListener를 추가하려고 할 수 있습니다.

2

코드를 실행하면 JLabel과 관련하여 NullPointerException이 발생합니다. 이것은 ActionListener를 처음 호출 할 때 초기화되지 않았습니다. 첫 번째 항목을 추가하면 추가되고 선택 항목이 변경됩니다.

0

ActionListener를 구현하는 것은 일반적인 패턴이 아닙니다.

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

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