1

ユーザーが選択しているリスト項目と、ユーザーが選択しているリスト項目を知るListSelectionListenerforを作成しようとしています。JListしたがって、リストに 3 つの項目が{Apple, Orange, Pear}あり、現在の選択がオンOrangeで、ユーザーが を選択した場合Pear、次のようになります。

  • srcFruitですOrange。と
  • destFruitPear

ここに私が持っているコードがあります:

myList.addListSelectionListener(new ListSelectionListener() {
    public void valueChanged(ListSelectionEvent fruitSelectionEvent) {
        printSourceAndDestFruit(myList, fruitSelectionEvent);
    }
});

private void printSourceAndDestFruit(JList list, ListSelectionEvent event) {
    FruitVO srcFruit = (FruitVO)list.getModel().getElementAt(event.getFirstIndex());
    FruitVO destFruit = (FruitVO)list.getModel().getElementAt(event.getLastIndex());

    System.out.println("srcFruit = " + srcFruit.getName() + " and destFruit = " = destFruit.getName());
}

アプリケーションが をロードして初期化するとき、JListデフォルトの選択肢はありません。次のアクションを実行すると:

  1. クリックOrange
  2. クリックPear
  3. Orangeもう一度クリック

これが私が得る印刷物です:

srcFruit = Orange and destFruit = Pear
srcFruit = Orange and destFruit = Pear

ここでどこが間違っていますか?getFirstIndex()/バグがありますかgetLastIndex()、それとも使用する正しいSwingメソッドではありませんか?

表示される出力は次のとおりです。

srcFruit = Orange and destFruit = Pear
srcFruit = Pear and destFruit = Orange

したがって、3回の選択(マウスクリック)を行ったとしても、最初のクリックOrangeはある値から次の値への変更ではなかったので、起動して呼び出さないのが正しいと思いますprintSourceAndDestFruit. 私は選択し、それはそれがであるとPear述べて正しいです。しかし、クリックして2番目に戻ると、printlnにはasとasが必要です。なぜだろう?!?!srcFruitOrangedestFruitPearOrangesrcFruitPeardestFruitOrange

前もって感謝します!

4

2 に答える 2

3

最初と最後のインデックスは、あなたが思っているものではありません。javadoc の内容は次のとおりです。

getFirstIndex()

選択が変更された可能性のある最初の行のインデックスを返します。

getLastIndex()

選択が変更された可能性がある最後の行のインデックスを返します。

したがって、梨とオレンジの選択はクリックするたびに変わり、梨はリストのオレンジの後にあるため、getFirstIndex()常にオレンジを返し、getLastIndex()常に梨を返します。

新しい選択を最後の選択と比較する場合は、最後の選択をいくつかのメンバー変数に保持し、選択が変更されるたびに新しい選択と比較し、getValueIsAdjusting()false を返します。

于 2012-12-15T00:07:36.233 に答える
1

選択が順序Orangeで行われる理由は、新しい選択インデックスではなく、アイテム インデックスの場所のみに基づいてfireValueChangedPearDefaultListSelectionModel呼び出すためです。ListModel

この関連するバグ レポートでも同様の質問がありましたが、これは正常な動作であり、次を使用して回避策を追加できることを示しています。

FruitVO srcFruit = (FruitVO)list.getModel().getElementAt(list.getMinSelectionIndex());
FruitVO destFruit = (FruitVO)list.getModel().getElementAt(list.getMaxSelectionIndex());
于 2012-12-15T03:51:02.780 に答える