2017-06-15 30 views
0

我有一个JCombobox项目的大名单。在选择一个项目时,我需要做一些事情。 我试着用的ActionListener与itemListner爪哇摇摆下拉选择收听者

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

你的代码是做正确的方式。它只选择一个元素,我检查它。可能是你的问题不包含在这。 – 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

我试着将你的例子作为一个独立的,它完美的作品。 但是,当我将它合并到我的系统中时,我得到了两次输出 - 那就是ActionPerformed执行两次..或者看起来像这样? –

+0

哈利路亚! 我解决了使用ItemListener而不是ActionListener的“double”动作,并且检查itemEvent被“选中”而不是DESELECTED。 这解决了它。非常感谢 –

0

请使用的ActionListeners,像这样:

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

我试了一下。我在我原来的帖子里有。我正在检查状态是否为SELECTED。 但是,它仍然一直在想所有以前的项目都被选中,而不是忽略它们。这是我做的:if(e.getStateChange()== ItemEvent.SELECTED) 它是不正确的? –

1

的问题,我面对的是这样的。当通过开放下降 用户滚落他无意中继续选择每次他并不需要的项目。

原因是,按上下拉时,它也是状态变化。所以我的解决方案是你可以添加keyTypedactionListener。然后你可以得到箭头键的代码并检查arraw按下。如下图所示:

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()); 
     } 
    } 
});