3

このバグがあり、JList にデータを入力した後、選択した項目の値を取得しようとしました。しかし、私がそれをしていると、2回呼び出されます。

これが私のコードです:

 public CaveAdventureUI(CaveGame game) {
    initComponents();
    playerCarryItemModel = new DefaultListModel();
    caveCarryItemModel = new DefaultListModel();
    this.caveGame = game;
    this.world = game.getCaveWorld();
    listSelectionModel = this.jListCaveCarryItems.getSelectionModel();
    listSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    this.listSelectionModel.addListSelectionListener( new SharedListSelectionHandler());
    //for debug purpose,see the world grid in console
    game.drawCaves();
    //new JComboBox(Mood.values());
    createGridQuarePanels();
    //world.startGame(GameLevel.Beginner);
    update();
}


private class SharedListSelectionHandler implements ListSelectionListener {
    public void valueChanged(ListSelectionEvent listSelectionEvent) {
        ListSelectionModel lsm = (ListSelectionModel)listSelectionEvent.getSource();
         if (!lsm.isSelectionEmpty()) {
            Occupant opt = mapOccupants.get(Integer.toString(jListCaveCarryItems.getSelectedIndex()));
            System.out.println("selected index :" +jListCaveCarryItems.getSelectedIndex() +"[["+opt.getName()+"]]");
        }
    }
}

上記のコードで、jList : jListCaveCarryItems を選択すると、SharedListSelectionHandler クラスがトリガーされます。ただし、JList をクリックすると、選択した値が 2 回出力されます。

誰でもそれを理解するのを手伝ってもらえますか?

ありがとうございます。それでは、お元気で、

4

1 に答える 1

10

2ListSelectionEventsは、 が選択されたときにディスパッチされますJList。1 つは選択イベント中、もう 1 つは選択イベント後にディスパッチされます。リスト選択リスナーの書き方より

isAdjusting フラグは、ユーザーがまだ選択を操作している場合は true であり、ユーザーが選択の変更を終了した場合は false です。

したがって、ListSelectionEvent値が調整されていないことを確認してください。

public void valueChanged( ListSelectionEvent listSelectionEvent)  {  
  if ( !listSelectionEvent.getValueIsAdjusting() && !lsm.isSelectionEmpty()) {  
     Occupant opt = ...
     ...
  }  
}  
于 2013-06-02T20:30:01.480 に答える