2012-10-05 29 views
5

我:的Java Swing - 如何處理仿製藥的ActionListener

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

導致在JDK7以下編譯器警告:

的JComboBox是原始類型。引用泛型類型的JComboBox應該是參數

我試圖把它給參數使得:

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

但是,這仍然留下了以下編譯器警告:

類型安全:未經檢查的投從Object到JComboBox

因此我不確定如何消除編譯器警告...

+0

是否有一個instanceof檢查的幫助?即使你知道你總是會在最後得到一個JComboBox。 – Rex

+0

我不認爲你「編碼」解決問題的解決方案。你可以,如何抑制警告。看看http://stackoverflow.com/questions/593996/how-to-suppress-java-compiler-warnings-for-specific-functions。問題是編譯器看着'ActionEvent.getSource'並且說「我有一個對象,而在理論上,你可以投我,你試圖讓我可能無法工作」 – MadProgrammer

+0

我明白你可以抑制警告,但這對我來說並不理想。如果我這樣做了所有的編譯器警告,那麼讓我們只是說它不會好。如果可能,找出原因並妥善解決它總是更好的。 –

回答

4

我讚賞這種方法。它避免了任何Typecasts,並且易於閱讀。

我改進了我的答案,現在它不會給你編譯器警告。 JComboBox的類型現在設置爲String。要獲取選定的項目,您必須通過ComboBoxModel。

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

謝謝羅賓和紀堯姆。做了一些改變。首先,我忘了在JComboBox上設置類型。接下來,我認爲只要調用getSelectedItem(),類型化的JComboBox就可以更容易地返回一個Typed Result。但它不能。現在它應該工作得很好。我沒有得到任何編譯器的警告。 – daniel

0

嘗試檢查:

A very useful link form StackOverflow

在幾句話,Java編譯器不知道是什麼物體是你想投的人,所以它不喜歡做演員沒有一句話,它必須告訴你,你可能犯了一個錯誤(但你知道什麼樣的類是你投的對象,所以不要介意)添加@SuppressWarning(「未選中」)

+0

@stephane(由Meriton編寫)。所以你不需要添加壓制警告;) 你可以寫: Class <?擴展Action > c = ClientAction.class; Action action = c.newInstance(); 這樣可以消除cast和warning兩種情況,並且以引入非泛型類型爲代價,因此您可以使用.class來獲取足夠準確的類型Class對象。 – Gianmarco

0

唯一的出路這裏只是爲了搶一個類型引用您的JComboBox:這樣

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

要麼和你ActionListener

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 
    } 
    } 
} 

或者,另一種解決方案是使用帶有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沒有什麼能阻止你製作這個一對多的。在這個例子中,我暴露了基本概念和一對一的關係。但正如你在另一篇文章中指出的那樣,UI元素的打字是毫無意義的。它不應該比模型更進一步。 –

+1

_沒有任何東西可以阻止你製作這個一對多的東西。我不認爲這是一個可行的選擇,最終我們至少同意在視圖領域中泛型的毫無意義:-) – kleopatra