我如何在向组合框添加项目时停止触发swing JComboBox itemlistener。

时间:2012-12-13 09:12:57

标签: java swing jcombobox itemlistener

我想要一个包含发票列表的JCombox。如果我选择发票,它将填写表格。通过选择“买方”组合框加载发票。 发票 combox有 itemStateChanged 事件。问题是当我选择买家时,表格填写第一张发票(发票组合框中的第一项)。所以我在发票组合框中将选中的索引设置为-1 。我得到的结果相同。

订单的toString方法返回发票号。


for (Order O : orderList) {
    jcbInvoiceNos.addItem(O);
} 

jcbInvoiceNos.setSelectedIndex(-1);

 private void addInvoiceNoItemChangeListener() {
        jcbInvoiceNos.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    loadInvoiceDetails();
                }
            }
        });
    }

public void loadInvoiceDetails() {
    System.out.println("Selected index " + jcbInvoiceNos.getSelectedIndex());
}

这总是打印选定的索引0 这应该是选择索引-1 我第一次选择买家。我想通过选择发票填写。不是买主。

请给我一个解决方案。

3 个答案:

答案 0 :(得分:3)

这样做的原因是DefaultComboBoxModel的实现:当将第一个项目添加到空模型时,它会自动选择第一个项目。稍微不一致的是它只在使用addElement(Object)时才这样做而不是在使用insertElement(Object, size)时所以干净(轻微的咳嗽,模数依赖于未记录的实现细节;-)是使用后者:

// loading the invoice ids
combo.removeAllItems();
for (int i = 0; i < 20; i++) {
    combo.insertItemAt("combo: " + count + " item: " + i, i);
}

另一方面,最初提供“信息性”选定项目(如f.i.“没有选择发票”)可能更加用户友好。如果您填写模型(而不是组合,它不接受列表中未包含的选定项目),则可以执行此操作,例如:

// the informational item
Object noInvoice = "no invoice selected";

// loading the invoice ids
model.removeAllElements();
model.setSelectedItem(noInvoice);
for (int i = 0; i < 20; i++) {
    model.addElement("model: " + count + " item: " + i);
}

// the itemListener ignoring the informational item
if (ItemEvent.SELECTED == e.getStateChange()) {
    if (noInvoice.equals(e.getItem())) return; 
    doLoadDetails(e.getItem());
}

答案 1 :(得分:2)

在组合中添加项目时,我会阻止侦听器调用。

有两种方法可以做到这一点。

  1. 在添加之前删除侦听器,在

  2. 之后读取
  3. 添加标志isAPI。在添加和重置之后设置它。在监听器中只需检查标志,如果确实如此,则返回。

答案 2 :(得分:-1)

尝试以下

private void addInvoiceNoItemChangeListener() {
    jcbInvoiceNos.addItemListener(new ItemListener(){
        @Override
        public void itemStateChanged(ItemEvent e){
            if(e.getText() != null && 0 < e.getText()){
                if(e.getStateChange() == ItemEvent.SELECTED){
                    loadInvoiceDetails();
                }
            }
        }
    });
}

这是因为它阻止了空事件文本和/或长度为零的文本字符串,如果你知道你的最小字符串大于2,那么将零增加到一个或更好的两个可能是明智的。 p>