2012-10-05 4 views
5

에 제네릭을 처리하기 위해 어떻게해야 :자바 스윙 - ActionListener를

JComboBox가 원시 유형 : jdk7에서 다음과 같은 컴파일러 경고가 발생

class CustomerActionListener implements ActionListener 
{ 
    @Override 
    public void actionPerformed(ActionEvent event) 
    { 
    JComboBox cb = (JComboBox)event.getSource(); 
    .. do something 
    } 
} 

합니다. 제네릭 형식 JComboBox에 대한 언급은 나는 그런 그에게 매개 변수화 시도했습니다

매개 변수가 있어야한다 :

JComboBox<String> cb = (JComboBox<String>)event.getSource(); 

그러나 이것은 여전히 ​​다음과 같은 컴파일러 경고 잎 :

유형의 안전 : 체크되지 않은 캐스트 Object에서 JComboBox로

따라서 컴파일러 경고를 제거하는 방법을 모르겠습니다 ...

+0

instanceof check가 도움이됩니까? 비록 당신이 알고 있더라도 당신은 항상 끝에 JComboBox를 얻을 것입니다. – Rex

+0

나는 문제를 해결하기위한 해결책을 "코드화"하지 않는다고 생각합니다. 어느 정도까지 경고를 억제 할 수 있습니다. http://stackoverflow.com/questions/593996/how-to-suppress-java-compiler-warnings-for-specific-functions를 살펴보십시오. 문제는 컴파일러가 'ActionEvent.getSource'를보고 "객체가 있고 이론적으로는 나를 캐스팅 할 수 있습니다. 나를 캐스팅하려고하는 것은 작동하지 않을 수도 있습니다"라고 말합니다. – MadProgrammer

+0

경고하지만 그것은 나에게 이상적이지 않습니다. 모든 컴파일러 경고에 그렇게했다면, 좋지 않을 것이라고 말하자. 항상 가능한 경우이를 왜 적절하게 해결하는 것이 더 나은지 항상 확인하십시오. –

답변

4

이 방법을 사용하는 것이 좋습니다. Typecast를 피하고 읽기 쉽습니다.

필자는 내 대답을 개선했지만 현재는 컴파일러 경고를 제공하지 않습니다. Type of JComboBox는 이제 String으로 설정됩니다. 선택한 항목을 가져 오려면 ComboBoxModel을 사용해야합니다. 이

JComboBox<String> myStringCb = new JComboBox<String>(); 
... 
myStringCb.addActionListener(new CustomerActionListener(myStringCb); 

같은

하나와 ActionListener 당신과 함께 : 유일한 방법은 밖으로 여기

class CustomerActionListener implements ActionListener 
{ 
    private JComboBox<String> comboBox; 
    public CustomerActionListener(JComboBox<String> comboBox){ 
    this.comboBox = comboBox; 
    } 
    @Override 
    public void actionPerformed(ActionEvent event) 
    { 
    // Just use the comboBox 
    ComboBoxModel<String> model = comboBox.getModel(); 
    int index = comboBox.getSelectedIndex(); 
    String choosen = model.getElementAt(index); 
    System.out.println("Hey you choose "+choosen); 
    } 
} 
+1

그리고이 방법으로 * JComboBox를 제거하는 것이 도움이됩니다. 제네릭 타입 JComboBox에 대한 참조는 매개 변수화되어야합니다 * 경고. 귀하의 코드는 정확히 동일한 문제를 가지고 있습니다. – Robin

+1

JDK7을 사용하여 해당 코드를 컴파일하십시오. -> 여전히 컴파일러 경고가 있습니다! 당신의 대답으로 문제가 해결되는 것은 아닙니다. –

+0

감사합니다. Robin and Guillaume. 약간의 변경을가했습니다. 먼저 JComboBox에서 유형을 설정하는 것을 잊었습니다. 다음으로, 입력 된 JComboBox는 getSelectedItem()을 호출하여 형식화 된 결과를 더 쉽게 반환 할 수 있다고 생각했습니다. 하지만 그렇게 할 수는 없습니다. 이제는 정상적으로 작동합니다. Im는 어떤 compiler 경고도 얻지 못했다. – daniel

0

봅니다이를 확인하려면 다음 몇 가지 단어에서

A very useful link form StackOverflow

는, 자바 컴파일러는 캐스팅하려는 일이 무엇인지 개체 모른다는 캐스팅을하고 싶지 않도록 한 마디도하지 말고, 당신에게 실수를하고 있다고 조언해야합니다. (그러나 당신은 어떤 종류의 클래스가 당신이 캐스팅하고있는 객체인지 알기 때문에 그것에 대해 신경 쓰지 마십시오.) @SuppressWarning ("unchecked")을 추가하십시오.

+0

@stephane (Meriton 작성). 따라서 억압 경고를 추가 할 필요가 없습니다.) 다음과 같이 쓸 수 있습니다 : Class > c = ClientAction.class; 작업 action = c.newInstance(); 이렇게하면 캐스트 및 경고가 모두 제거되므로 비 제네릭 형식을 도입해야하므로 .class를 사용하여 충분히 정확하게 형식화 된 Class 개체를 얻을 수 있습니다. – Gianmarco

0

(가) 입력 된 사용자의 JComboBox을 참조 잡아입니다

class CustomerActionListener implements ActionListener { 

    private JComboBox<String> cb; 

    public CustomerActionListener(JComboBox<String> cb) { 
    this.cb = cb; 
    } 

    @Override 
    public void actionPerformed(ActionEvent event) { 
    if(event.getSource()==cb) { 
     // Here you can do something with the typed cb 
    } 
    } 
} 

또는를, 또 다른 해결책은 익명 ActionListener에 0123을 사용하는 것입니다.참조 :

final JComboBox<String> myStringCb = new JComboBox<String>(); 
myStringCb.addActionListener(new ActionListener(){ 

    public void actionPerformed(ActionEvent e) { 
     // Here you can refer directly to myStringCb 
    } 

}); 
+0

어 ... 행동의 기본 개념에 상당히 모순됩니다. (일대 다 :-) – kleopatra

+0

@kleopatra 아무 것도 당신이 일대 다 (one-to-many)를 만들지 못하게하지 마십시오. 이 예제에서는 기본 개념과 일대일 관계를 노출했습니다. 그러나 다른 게시물에서 지적했듯이 UI 요소의 입력은 무의미합니다. 모델 이상으로 진행해서는 안됩니다. –

+1

_ 당신이 일대 다 (one-to-many)를 만들지 못하게합니다 ._ 타겟 목록을 유지하는 것 외에는 아무것도 없습니까? 나는 그것이 실행 가능한 옵션이라고 생각하지 않습니다. 결국 뷰 영역에서 제네릭의 무의미한 종류에 동의합니다 :-) – kleopatra