Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing-如何在ActionListener中处理泛型_Java_Swing_Generics_Java 7 - Fatal编程技术网

Java Swing-如何在ActionListener中处理泛型

Java Swing-如何在ActionListener中处理泛型,java,swing,generics,java-7,Java,Swing,Generics,Java 7,我有: 这会导致jdk7中出现以下编译器警告: JComboBox是一种原始类型。对泛型类型JComboBox的引用应参数化 我尝试将其参数化为: class CustomerActionListener implements ActionListener { @Override public void actionPerformed(ActionEvent event) { JComboBox cb = (JComboBox)event.getSource(); .

我有:

这会导致jdk7中出现以下编译器警告:

JComboBox是一种原始类型。对泛型类型JComboBox的引用应参数化

我尝试将其参数化为:

class CustomerActionListener implements ActionListener
{
  @Override
  public void actionPerformed(ActionEvent event)
  {
    JComboBox cb = (JComboBox)event.getSource();
    .. do something
  }
}
JComboBox cb=(JComboBox)event.getSource();
但这仍然会留下以下编译器警告:

类型安全:未选中从对象到JComboBox的强制转换

因此,我不确定如何消除编译器警告…

尝试检查以下内容:


简单地说,Java编译器不知道您要强制转换的对象是什么,所以它不喜欢在没有单词的情况下进行强制转换,它必须通知您可能犯了错误(但是您知道您要强制转换的对象是什么类型的类,所以不必介意)添加@SuppressWarning(“未选中”)我很欣赏这种方法。它避免了任何类型转换,易于阅读

我改进了我的答案,现在它不会给你编译器警告。JComboBox的类型现在设置为String。要获取所选项目,必须遍历ComboBoxModel

JComboBox<String> cb = (JComboBox<String>)event.getSource();
类CustomerActionListener实现ActionListener
{
专用JComboBox组合框;
公共CustomerActionListener(JComboBox组合框){
this.comboBox=组合框;
}
@凌驾
已执行的公共无效操作(操作事件)
{
//只需使用组合框
ComboBoxModel=comboBox.getModel();
int index=comboBox.getSelectedIndex();
字符串choosen=model.getElementAt(索引);
System.out.println(“Hey you choose”+choosen);
}
}

这里唯一的出路是获取对您的
JComboBox的键入引用

要么像这样

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);
  }
}
或者,另一种解决方案是使用匿名
ActionListener
final
引用:

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
    }
  }
}
final JComboBox myStringCb=new JComboBox();
myStringCb.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
//在这里,您可以直接参考myStringCb
}
});

另一种解决方案

您还可以使用以下模式:

类CustomerActionListener实现ActionListener
{
@凌驾
已执行的公共无效操作(操作事件)
{
JComboBox cb=(JComboBox)event.getSource();
做点什么
}
}

检查实例是否有帮助?即使你知道你最终会得到一个JComboBox,我也不认为你“编写”了一个解决问题的解决方案。无论如何,您可以抑制警告。看一看。问题是编译器查看
ActionEvent.getSource
并说“我有一个对象,从理论上讲,您可以强制转换我,您试图强制转换我的对象可能不起作用。”我知道您可以抑制警告,但这对我来说并不理想。如果我对所有的编译器警告都这样做,那么我们只能说这不好。如果可能的话,最好找出原因并妥善解决。ui中的泛型。。。你是个讨厌的人,仅此而已。在这里,您无论如何都需要强制转换源代码,无论是否进一步键入都不重要(只要do内容不依赖于特定的数据类型)@stephane(由Meriton编写)。因此,不需要添加抑制警告;)您可以这样写:ClassAnd这将如何帮助摆脱JComboBox是一种原始类型。对泛型类型JComboBox的引用应参数化。您的代码有完全相同的问题请尝试使用JDK7-->编译该代码您仍然有编译器警告!你的回答并不能解决目前的问题。谢谢罗宾和纪尧姆。做了一些改变。首先,我忘了在JComboBox上设置类型。接下来,我认为通过调用getSelectedItem(),类型化JComboBox可以更容易地返回类型化结果。但它不能。现在它应该可以正常工作了。我没有收到任何编译器警告。。。这与行为的基本理念(即一对多:-)非常矛盾。@kleopatra没有什么能阻止你做出这种一对多的行为。在这个例子中,我展示了基本概念和一对一的关系。但正如您在另一篇文章中所指出的,UI元素的类型是毫无意义的。它不应该超出模型的范围。没有什么可以阻止你制作一对多。除了。。。保留目标清单?我认为这不是一个可行的选择,最后我们至少同意在视图领域中泛型的那种无意义:-)
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
    }
  }
}
final JComboBox<String> myStringCb = new JComboBox<String>();
myStringCb.addActionListener(new ActionListener(){

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

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