我想要一个包含发票列表的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 我第一次选择买家。我想通过选择发票填写。不是买主。
请给我一个解决方案。
答案 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)
在组合中添加项目时,我会阻止侦听器调用。
有两种方法可以做到这一点。
在添加之前删除侦听器,在
添加标志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>