3

我有这个错误,在填充 JList 后,我​​尝试检索所选项目的值。但是当我这样做时,它被调用了两次。

这是我的代码:

 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 时,它会打印出两次选定的值。

谁能帮我弄清楚?

感谢和问候,

4

1 回答 1

10

2ListSelectionEvents在被选中时调度JList——一个在选择事件期间,另一个在选择事件之后。从如何编写列表选择侦听器

如果用户仍在操作选择,则 isAdjusting 标志为真,如果用户已完成更改选择,则为假。

因此,请确保该ListSelectionEvent值未调整。

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