2017-06-15 5 views
0

JComboboxには大きなアイテムリストがあります。アイテムを選択すると、何かが必要になります。 私はアクションリスナーでのactionListenerとし、itemListnerJavaスイングドロップダウン選択リスナー

myComboBox.addItemListener(new ItemListener(){ 
     @Override 
     public void itemStateChanged(ItemEvent e) { 
     if (e.getStateChange() == ItemEvent.SELECTED) { 
      String selection = (String)myComboBox.getSelectedItem(); 
      System.out.println("Selected: "+selection) ; 
     } 
    } 
}); 

てみました、私は

に問題が同じことを試してみました、私が直面していますオープンドロップを介してユーザロールがダウンし、彼が不注意それぞれを選択しておく場合は、この です彼は必要ないアイテムです。 (またはマウスホイールなどを使用する場合)。
私はその選択肢だけをキャッチできるようにしたいと考えています。 どうすればできますか?

+0

あなたのコードでは、それを行うための正しい方法です。私はそれをチェックした要素を1つだけ選択します。あなたの問題はこれに含まれていないかもしれません。 – Blasanka

+0

Blasanka、キーボードを使用してリストをスクロールしてください。リスト内の100番目のアイテムを実際に選択する必要がある場合は、前の99個のアイテムのそれぞれを選択しているとコードは考えています。 –

答えて

2

問題、私は開いているドロップを介してユーザロールがダウンし、彼が不注意に彼が必要としない各項目を選択しておく場合は、これはされて直面しています。

あなたが使用することにより、焼成からリスナーを防ぐことができます。

comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE); 

例えば:

/* 
    This works on non editable combo boxes 
*/ 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.plaf.basic.*; 
import javax.swing.text.*; 

public class ComboBoxAction extends JFrame implements ActionListener 
{ 
    public ComboBoxAction() 
    { 
     JComboBox<String> comboBox = new JComboBox<String>(); 
     comboBox.addActionListener(this); 

     comboBox.addItem("Item 1"); 
     comboBox.addItem("Item 2"); 
     comboBox.addItem("Item 3"); 
     comboBox.addItem("Item 4"); 

     // This prevents action events from being fired when the 
     // up/down arrow keys are used on the dropdown menu 

     comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE); 

     getContentPane().add(comboBox); 
     getContentPane().add(new JTextField(), BorderLayout.SOUTH); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     System.out.println(e.getModifiers()); 

     JComboBox comboBox = (JComboBox)e.getSource(); 
     System.out.println(comboBox.getSelectedItem()); 

     // make sure popup is closed when 'isTableCellEditor' is used 

//  comboBox.hidePopup(); 
    } 

    public static void main(String[] args) 
    { 
     ComboBoxAction frame = new ComboBoxAction(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

私はスタンドアローンとしてあなたの例を試しました、そして、それは完全に動作します。 しかし、それを私のシステムに組み込むと、出力が2回表示されます。つまり、ActionPerformedは2回実行されます。 –

+0

ハレルヤ! ActionListener ..ではなくItemListenerを使用して "double"アクションを解決しました。また、itemEventがDESELECTEDではなく "selected"であることを確認しました。 これで解決しました。どうもありがとう –

0

このように、ActionListenerにを使用してください:オープンドロップ を介してユーザロールがダウンし、彼が不注意に彼が必要としない各項目を選択し続けると

combo.addActionListener (new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     // doSomething(); 
    } 
}); 
+0

Akash返信いただきありがとうございます。私は使いました。私はポストでそれを言いました。 ドロップダウンにリスト内の10個の項目があり、ユーザーが位置「7」にある項目を選択したい場合、問題が表示されます。彼は2つのことをすることができます: 1) - 彼はアイテム「7」に直接ナビゲートし、問題はありません。 2) - ユーザーは マウスホイールまたはキーボードの矢印を使用して、最初から7番までのリストを「ロール」します。この場合、actionListenerは1、2、3、... 7の各項目を選択することを認識します。私は、プログラムが1..6の項目を「無視する」ようにしたい。 –

+0

Dima、e.getStateChange()を使用すると、選択した項目を取得して項目を無視できます。 – Akash

+0

私はそれを試しました。私は元の投稿にそれを持っています。状態が選択されているかどうかを確認しています。 しかし、以前のすべての項目も無視されずに選択されたと考えています。これは私が行うことです:if(e.getStateChange()== ItemEvent.SELECTED) それは間違っていますか? –

1

問題、私が直面していますが、これはあります。

これは、アロワを上下に押すと状態が変化するためです。だから私の解決策は、keyTypedactionListenerを追加することができます。その後、矢印キーのコードを取得して、押し出しプレスを確認することができます。以下のように:

myComboBox.addKeyListener(new java.awt.event.KeyAdapter() { 
    public void keyTyped(java.awt.event.KeyEvent evt) { 
     String x = String.valueOf(myComboBox.getSelectedItem()); 

     if(evt.getKeyCode() == 40) { 
      System.out.println(x); 
      //System.out.println(evt.getKeyCode()); 
     } 
    } 
}); 
関連する問題