2012-10-05 26 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