情况就是这样,我有一个带有选项卡式窗格的 jFrame,在选项卡中我有几个 jTables 和一个 jTree。我希望能够根据用户是否使用 ctrl/shift + 单击而不是常规单击来链接表和树之间的选择。(如果您按住 ctrl 并单击第一个表/树,它会添加到整体选择中,如果您使用常规单击它会清除其他表/树中的选择)。目前我遇到了 Java 的 jTree 组件的问题。我添加了一个 TreeSelectionListener 和一个 MouseListener 以及一个实现这两个接口的类,称之为 MyBigListener;IE
MyBigListener listener = new MyBigListener();
jTree1.addMouseListener( listener );
jTree1.addTreeSelectionListener( listener );
MyBigListener implements TreeSelectionListener, MouseListener {
private boolean chained = false;
public synchronized setChained(boolean ch){
chained = ch;
}
public synchronized boolean isChained(){
return chained
}
public void valueChanged(TreeSelectionEvent e){
if(isChained()){ blah... }
}
public void mousePressed(MouseEvent e){
setChained(e.isControlDown() || e.isShiftDown());
}
}
如果用户使用 ctrl/shift + 单击,我的计划是设置一个布尔标志,我可以在树选择侦听器实现的 valueChanged(TreeSelectionEvent e) 期间检查该标志。我希望能够在 valueChanged TreeSelectionEvents 之前处理鼠标事件,但问题是我在 valueChanged treeSelection 事件之后收到鼠标事件。这对我来说似乎很奇怪,我在鼠标按下事件触发之前收到了选择更改,而选择更改实际上是由按下鼠标发起的。(我已经同步了布尔标志设置,具有讽刺意味的是,这有助于突出事件的错误顺序。)
我已经尝试过诸如添加 keyListener 之类的替代方法,但是当焦点位于单独的帧上时这不起作用,当用户按住 ctrl 然后单击 jTree 导致它同时接收焦点和触发时,这会让我感到困惑任何 valueChanged 选择事件。
任何帮助将不胜感激,谢谢!
--编辑--@akf 我在一个选项卡式窗格中有单独的 jTables 和 jTrees,它们用作节点图中数据的摘要/控制面板。我在选项卡式窗格中使用这些组件对显示在单独 jFrame 中的图形进行协调选择。与 jTree 一样,每个表都可以单独进行选择。窗格之间的协调很棘手。到目前为止,这适用于 jTable 组件,因为我触发了新的选择作为 MouseEvent 的结果,在那里我可以判断 shift/ctrl 按钮是否已按下,制定我的新选择,并将其传递给协调所有选择之间的父框架窗格并将最终选择发送到图表。但是,父级需要知道它是否需要在窗格之间链接选择,或者挤压其他窗格。有了 jTables 就又好了,因为单击鼠标会触发选择更改。jTree 是一个更大的问题,因为我正在做一些强制选择。如果您单击一个分支,它会强制所有叶子进入选择。我需要实现一个 TreeSelectionListener 来做到这一点,但只获得一个 valueChanged(TreeSelectionEvent) 来实现更改。我添加了一个 mouseListener 来监听 ctrl+clicks 和 shift+clicks,但显然事件并不总是以相同的顺序发生.. 至少到目前为止我在 mousePressed 事件之前收到 valueChanged 事件,所以检查是否是 ctrl +单击在选择已被修改后发生的帖子。我需要实现一个 TreeSelectionListener 来做到这一点,但只获得一个 valueChanged(TreeSelectionEvent) 来实现更改。我添加了一个 mouseListener 来监听 ctrl+clicks 和 shift+clicks,但显然事件并不总是以相同的顺序发生.. 至少到目前为止我在 mousePressed 事件之前收到 valueChanged 事件,所以检查是否是 ctrl +单击在选择已被修改后发生的帖子。我需要实现一个 TreeSelectionListener 来做到这一点,但只获得一个 valueChanged(TreeSelectionEvent) 来实现更改。我添加了一个 mouseListener 来监听 ctrl+clicks 和 shift+clicks,但显然事件并不总是以相同的顺序发生.. 至少到目前为止我在 mousePressed 事件之前收到 valueChanged 事件,所以检查是否是 ctrl +单击在选择已被修改后发生的帖子。
现在,我正在发布一个待定的选择更改,然后让 MouseListener 抓住它并将其发送到链上,但如果不能保证这些事件以相同的顺序发生,那么在某些时候它会失败。实施延迟器也会让我犯错。
感谢你目前的帮助。
--EDIT2-- @ykaganovich
我认为覆盖 fireValueChanged 方法更接近正确的处理方式。根据我对哪些操作应该导致对其他组件的“链接”选择的定义,我需要在 valuedChanged 方法触发之前收集一些关于正在发生的事情的上下文。这基本上意味着在所有情况下我都可以自己调用它,我可以通过谁触发它来定义它的含义。即,如果鼠标事件导致它并且 ctrl 关闭,则设置我需要设置的内容(解释)然后触发。如果由于键盘事件而发生变化,请再次设置我需要设置的内容,然后触发。我不认为 TreeSelectionModel 是要走的路,因为我仍然不知道事件触发时的情况。我认为这意味着我需要重写部分 jTree 来做到这一点,但我想我' 看看情况如何。谢谢。