两个JComboBox用户无法选择相同的值

时间:2015-05-29 12:51:58

标签: java swing jcombobox itemlistener

我有两个$mail。第一个具有元素“一”,“二”,“三”的模型,第二个具有元素“三”,“四”的模型。当用户在第一个JComboBox中选择元素“3”时,他不能在第二个JComboBox中选择元素“3”。反过来 - 当用户在第二个JComboBox中选择元素“3”时,他不能在第一个CB中选择相同的元素。我怎么能用Java做到这一点?

谢谢你的回答。 还有一个问题。当我动态创建ComboBoxes时(当有人点击按钮时 - 按钮actionListener),每个新的ComboBox都有相同的模型 - 相同的元素列表。我怎么检查这个案子?像Blip说的一样吗?

3 个答案:

答案 0 :(得分:3)

在我看来,您可以将ItemListener添加到2 JComboBox。如果用户在"three"中的任何一个中选择了对象JComboBox,则可以从其他"three"的模型中删除对象JComboBox。如果用户在一个"three"中取消选择对象JComboBox,则可以将对象"three"添加到另一个JComboBox的模型中。

您可以通过以下方式实施:

  1. 让我们将两个JComboBox存储在变量box1box2中,这些变量可以实现为:

    JComboBox<String> box1 = new JComboBox<>(new String[]{"one", "two", "three"});
    JComboBox<String> box2 = new JComboBox<>(new String[]{"three", "four"});
    
  2. 现在向这些itemListener添加JComboBox并将其传递给方法boxItemSelected

    box1.addItemListener(new ItemListener(){
    
        itemStateChanged(ItemEvent e){
            boxItemSelected(e);
        }
    });
    box2.addItemListener(new ItemListener(){
    
        itemStateChanged(ItemEvent e){
            boxItemSelected(e);
        }
    });
    
  3. 现在实施boxItemSelected(e)

    void boxItemSelected(ItemEvent e){
    
        //Check the item selected/deselected is "three" else do nothing.
        if (e.getItem().equals("three")){ 
    
        //Find the box on which this action was not performed to change its model.
            JComboBox<String> oppositeBox;
            if(e.getSource().equals(box1)){
                oppositeBox = box2;
            }else{
                oppositeBox = box1;
            }
    
        //Check the item is selected or deselected to remove or add "three" to item list.
            if(e.getStateChange() == ItemEvent.SELECTED){
                oppositeBox.removeItem("three");
            }else{
                oppositeBox.addItem("three");
            }
        }
    }
    
  4. 添加信息

    如果您有多个重叠且只能在一个JComboBox中选择的项目,则稍微修改方法boxItemSelected就可以解决您的问题,如下图所示:< / p>

    更改上述代码中的行:

    if (e.getItem().equals("three"))
    

    if (e.getItem().equals("three") || e.getItem().equals("<new item>") || ....)
    

    并改变

    oppositeBox.removeItem("three");
    oppositeBox.addItem("three");
    

    oppositeBox.removeItem(e.getItem());
    oppositeBox.addItem(e.getItem());
    

    在任何情况下,用户都无法在JComboBox中选择相同的项目。所有这些都发生在幕后,没有用户使用用户界面的知识。

      

    当我动态创建ComboBoxes时(有人点击按钮时)    - 在按钮actionListener中),每个新的ComboBox都有相同的模型 - 相同的元素列表。我怎么检查这个案子?和Blip说的一样   ?

    在回答上述情况时,我正在考虑所有JComboBox中的所有项目都存储在List变量中,并且如果在{{1}中的任何一个中选择了1个项目然后,在JComboBox的其余部分中无法选择该项目。如果我的假设是正确的,那么我建议你做以下事情:

    1. 创建一个JComboBoxList<JComboBox<?>>并将其初始化如下:

      boxes
    2. List<JComboBox<?>> boxes = new ArrayList<>(); (动态JButton)变量的JComboBox实施按钮中,创建一个变量说ActionListener作为items的实例存储List的项目并添加项目

      JComboBox
    3. 现在从动态生成的其他List<String> items = new Vector<>(); items.add("One"); items.add("Two"); ...... 中选择的items变量中删除项目:

      JComboBox
    4. 现在,在初始化 Iterator<JComboBox<?>> iterator = boxes.iterator(); while(iterator.hasNext()){ JComboBox<?> existing = iterator.next(); items.remove(existing.getSelectedItem()); } 个实例后,JComboBoxbox的模型设置为先前已初始化和修剪的box变量List

      items
    5. 现在将box.setModel(new DefaultComboBoxModel(items)); 变量JComboBox添加到box变量List

      boxes
    6. 此外,在上面提到的boxes.add(box); 实现中,将ActionListener添加到ItemListenerbox新实例化的变量,并将其传递给方法{{1 }}:

      JComboBox
    7. 现在必须更改boxItemSelected的实施以适应变化:

      box.addItemListener(new ItemListener(){
      
          itemStateChanged(ItemEvent e){
              boxItemSelected(e);
          }
      });
      

答案 1 :(得分:3)

所以这绝对是可能的。我认为最好的方法是检查两个框的选定索引,然后根据索引值的结果执行逻辑。在下面的示例中,您可以看到演示。发生的事情是ComboBox1和2上有一个ActionListener。如果值匹配,我使用了索引但你也可以得到字符串值以确保它们不匹配。

public class SOF extends JFrame {
private JPanel mainPanel, comboPanel;
private JComboBox jcb1, jcb2;

public SOF()
{
    super("Combo Box Example");
    mainPanel = new JPanel();
    mainPanel.add(configureCombo());
    add(mainPanel);
    setSize(200,200);
    setLocationRelativeTo(null);
    setVisible(true);


    jcb1.addActionListener(new ActionListener() {
       @Override
       public void actionPerformed(ActionEvent e)
       {
           //You can replace this with, jcb2.getSelectedItem if you don't know the indexes or if they will be random. 
           if((jcb1.getSelectedIndex() == 2) && (jcb2.getSelectedIndex() == 0))
           {
               JOptionPane.showMessageDialog(null, "Cannot select 3 in both field.");
               jcb1.setSelectedIndex(-1);
               jcb2.setSelectedIndex(-1);
           }
            //ANOTHER OPTION
           If((jcb1.getSelectedValue().equals("three") && (jcb2.getSelectedValue().equals("three")
           {
            LOGIC
           }
       }
    });

    jcb2.addActionListener(new ActionListener() {
       @Override
       public void actionPerformed(ActionEvent e)
       {
           //You can replace this with, jcb2.getSelectedItem if you don't know the indexes or if they will be random. 
           if((jcb2.getSelectedIndex() == 0) && (jcb1.getSelectedIndex() == 2))
           {
               JOptionPane.showMessageDialog(null, "Cannot select 3 in both field.");
               jcb1.setSelectedIndex(-1);
               jcb2.setSelectedIndex(-1);
           }
       }
    });


}

private JPanel configureCombo()
{
    String[] cb1List = {"one", "two", "three"};
    String[] cb2List = {"three", "four"};
    comboPanel = new JPanel(new GridLayout(1,2));
    jcb1 = new JComboBox(cb1List);
    jcb2 = new JComboBox(cb2List);
    comboPanel.add(jcb1);
    comboPanel.add(jcb2);
    return comboPanel;
}
/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    SOF s = new SOF();
}

}

如果选择了匹配的框,则会弹出一条错误消息并取消选择两个组合框。

答案 2 :(得分:2)

你可以使用组合框的模型,但更简单的方法是在用户要求程序接受值时检查所选值,可能在JButton的ActionListener中,然后如果有两个相同的值选中,取消选择它们并使用JOptionPane警告用户。或者,您可以将侦听器中的代码(Actionlistener或ItemListener)添加到两个JComboBox中,以检查其他组合框的选定值以确保它们不相同,如果是,则警告用户并取消选择错误的选择。