7

私は持っている:

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

これにより、jdk7 で次のコンパイラ警告が発生します。

JComboBox は raw タイプです。ジェネリック型 JComboBox への参照はパラメータ化する必要があります

私はそれを次のようにパラメータ化しようとしました:

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

ただし、これでも次のコンパイラ警告が残ります。

型の安全性: Object から JComboBox へのチェックされていないキャスト

したがって、コンパイラの警告を取り除く方法がわかりません...

4

4 に答える 4

4

私はこのアプローチに感謝します。タイプキャストを回避し、読みやすくなっています。

答えを改善しましたが、コンパイラの警告は表示されません。これで、JComboBoxのタイプが文字列に設定されます。選択したアイテムを取得するには、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);
  }
}
于 2012-10-05T01:59:48.623 に答える
1

ここから抜け出す唯一の方法は、あなたの への型付き参照を取得することです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
    }
  }
}

または、別の解決策は、参照ActionListenerとともに匿名を使用することです。final

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

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

});
于 2012-10-05T08:11:26.073 に答える
0

これを確認してみてください:

非常に便利なリンク フォーム StackOverflow

簡単に言えば、Java コンパイラーは、キャストしようとしているオブジェクトが何であるかを認識していないため、何も言わずにキャストを実行することを好みません。キャストしているオブジェクトがどの種類のクラスであるかを知っているので、気にしないでください) @SuppressWarning("unchecked") を追加します

于 2012-10-05T00:54:22.287 に答える