1

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

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

这总是打印Selected index 0这应该是Selected index -1我第一次选择买家时。我想通过选择发票来填写。不是买方。

请给我一个解决方案。

4

3 回答 3

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

另一方面,最初显示“信息性”选定项目(如 fi“未选择发票”)可能对用户更友好。如果您填充模型(而不是组合,它不接受未包含在列表中的选定项目),则可以这样做,例如:

// 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());
}
于 2012-12-13T12:28:32.090 回答
2

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

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

  1. 在添加之前删除侦听器并在之后读取

  2. 添加一个标志 isAPI。在添加之前设置它并在之后重置。在侦听器中只需检查标志,如果为真则返回。

于 2012-12-13T09:41:57.653 回答
-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,将 0 增加到 1 或更好的 2 可能是明智的!

于 2017-07-13T15:42:36.827 回答