4

我已经实现了自己的事件处理程序并将其添加到表的选择模型中:

table.getSelectionModel().addListSelectionListener(event);

并实现了“事件”的方法(上面提到过):

public void valueChanged(ListSelectionEvent e) {
    log.debug("value changed");
}

不幸的是,如果我有机会进行选择,则事件会触发两次,并且似乎无法找到关联的表,因为 e.getSource 提供了 javax.swing.DefaultListSelectionModel。

因此我的问题是:

1) 为什么虽然 eventListener 只注册了一次,但它会触发两次?

2) 如何找到选择适用的表格?DefaultListSelectionModel 似乎没有提供任何 getSource() 或类似功能。

非常感谢!

4

3 回答 3

12

谢谢德拉蒙..它工作正常....

我们的准则

vMachinesTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

    public void valueChanged(ListSelectionEvent lse) {
        if (!lse.getValueIsAdjusting()) {
            System.out.println("Selection Changed");
        }
    }
});

谢谢

特遣队

于 2012-04-17T06:30:44.260 回答
6

1)我想你会发现它会触发一次,用于取消选择旧选择,一次用于选择新选择。如果您记录事件的详细信息,您应该确切地看到正在发生的事情。我不记得细节,所以也许这是错误的。无论哪种方式,您都应该能够在事件上调用 getValueIsAdjusting() 并且只使用链中的最后一个(即当它返回 false 时)。

2)您通常不需要,但AFAIK唯一的方法是专门为表创建监听器(即将表传递给构造函数并记住它)。

于 2008-12-17T17:19:45.330 回答
3

由于不止一个 JTable(或我猜的其他组件)可以共享相同的选择模型,因此从事件中请求关联的 JTable 是没有意义的。这与您无法从 TableModel 中检索 JTable 的原因相同。正如 Draemon 建议的那样,将对 JTable 的引用存储在(或使其可访问)您的侦听器类中。

于 2008-12-17T19:09:15.577 回答