我有两个$mail
。第一个具有元素“一”,“二”,“三”的模型,第二个具有元素“三”,“四”的模型。当用户在第一个JComboBox
中选择元素“3”时,他不能在第二个JComboBox
中选择元素“3”。反过来 - 当用户在第二个JComboBox
中选择元素“3”时,他不能在第一个CB中选择相同的元素。我怎么能用Java做到这一点?
谢谢你的回答。 还有一个问题。当我动态创建ComboBoxes时(当有人点击按钮时 - 按钮actionListener),每个新的ComboBox都有相同的模型 - 相同的元素列表。我怎么检查这个案子?像Blip说的一样吗?
答案 0 :(得分:3)
在我看来,您可以将ItemListener
添加到2 JComboBox
。如果用户在"three"
中的任何一个中选择了对象JComboBox
,则可以从其他"three"
的模型中删除对象JComboBox
。如果用户在一个"three"
中取消选择对象JComboBox
,则可以将对象"three"
添加到另一个JComboBox
的模型中。
您可以通过以下方式实施:
让我们将两个JComboBox
存储在变量box1
和box2
中,这些变量可以实现为:
JComboBox<String> box1 = new JComboBox<>(new String[]{"one", "two", "three"});
JComboBox<String> box2 = new JComboBox<>(new String[]{"three", "four"});
现在向这些itemListener
添加JComboBox
并将其传递给方法boxItemSelected
:
box1.addItemListener(new ItemListener(){
itemStateChanged(ItemEvent e){
boxItemSelected(e);
}
});
box2.addItemListener(new ItemListener(){
itemStateChanged(ItemEvent e){
boxItemSelected(e);
}
});
现在实施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");
}
}
}
添加信息
如果您有多个重叠且只能在一个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
的其余部分中无法选择该项目。如果我的假设是正确的,那么我建议你做以下事情:
创建一个JComboBox
说List<JComboBox<?>>
并将其初始化如下:
boxes
在List<JComboBox<?>> boxes = new ArrayList<>();
(动态JButton
)变量的JComboBox
实施按钮中,创建一个变量说ActionListener
作为items
的实例存储List
的项目并添加项目
JComboBox
现在从动态生成的其他List<String> items = new Vector<>();
items.add("One");
items.add("Two");
......
中选择的items
变量中删除项目:
JComboBox
现在,在初始化 Iterator<JComboBox<?>> iterator = boxes.iterator();
while(iterator.hasNext()){
JComboBox<?> existing = iterator.next();
items.remove(existing.getSelectedItem());
}
个实例后,JComboBox
将box
的模型设置为先前已初始化和修剪的box
变量List
items
现在将box.setModel(new DefaultComboBoxModel(items));
变量JComboBox
添加到box
变量List
:
boxes
此外,在上面提到的boxes.add(box);
实现中,将ActionListener
添加到ItemListener
,box
新实例化的变量,并将其传递给方法{{1 }}:
JComboBox
现在必须更改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中,以检查其他组合框的选定值以确保它们不相同,如果是,则警告用户并取消选择错误的选择。