1

請求書のリストを含むJComboxが必要です。請求書を選択すると、フォームに記入されます。請求書は、「購入者」コンボボックスを選択することで読み込まれます。 請求書comboxにはitemStateChangedイベントがあります。問題は、購入者を選択すると、フォームに最初の請求書(請求書コンボボックスの最初のアイテム)が入力されることです。そのため、請求書コンボボックスで選択したインデックスを-1に設定しました。私が得たのと同じ結果。

OrderのtoStringmethosは、請求書番号を返します。


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である必要があります。請求書を選択して記入したい。買い手ではありません。

これに対する解決策を教えてください。

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

コンボにアイテムを追加するときにリスナーが呼び出されないようにします。

これを行うには2つの方法があります。

  1. 追加する前にリスナーを削除し、後に読み取る

  2. フラグisAPIを追加します。追加する前に設定し、後でリセットします。リスナーでフラグを確認し、それがtrueの場合は戻るだけです。

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

これは、nullイベントテキストや長さがゼロのテキスト文字列をブロックするために機能します。最小文字列が2より大きいことがわかっている場合は、0を1または2より大きくするのが賢明かもしれません。

于 2017-07-13T15:42:36.827 に答える