Java: JTextAreas 后面的JPanel 的MouseListener
Java: MouseListener of JPanel behind JTextAreas
我创建了一个基本 JPanel
完全覆盖(不可编辑)JTextArea
的组件。我希望每次单击 JPanel
区域时触发 MouseListener
。我确实想将监听器添加到 JPanel
一次,而不是添加 n 次到 JTextArea
s.
有没有办法将 JTextArea
发送到后台,以便单击 JPanel
"through" JTextArea
?
注意:使用 JLabel
s 这没有任何特殊之处,JPanel
s 监听器总是被触发,但我更喜欢 JTextArea
s,因为换行符。
已提出解决方案 here,但它可能无法完全满足您的需求。
我不知道是否有办法绕过添加监听器 n 次,但如果没有,您可以将这个过程干净地集成到您的代码中。
例如,用专用方法添加JTextArea
s:
public void addJTextArea(JTextArea tArea){
this.add(tArea, ...);
tArea.addMouseListener(this.listener);
}
或者更透明地扩展 JTextArea
:
public class ClickableTextArea extends JTextArea {
public ClickableTextArea(MouseListener listener){
super();
addMouseListener(listener);
}
}
With JLabels this works without anything special, the JPanels Listener is always fired
这是因为默认情况下 JLabel 不包含 MouseListener,因此 MouseEvent 会向上传递到父树,直到找到确实使用 MouseListener 的组件。
在 JTextArea 的情况下,MouseListener 被添加到文本区域,因此您可以定位插入符号和 select 文本等。如果您不需要所有这些功能,您可以从每个中删除 MouseListener带有类似代码的文本区域:
JTextArea textArea = new JTextArea(...);
MouseListener[] ml = (MouseListener[])textArea.getListeners(MouseListener.class);
for (int i = 0; i < ml.length; i++)
textArea.removeMouseListener( ml[i] );
但是,由于您必须为每个文本区域执行此操作,我建议将 MouseListener 添加到每个文本区域更容易。您可以与每个文本区域共享相同的 MouseListener。
我创建了一个基本 JPanel
完全覆盖(不可编辑)JTextArea
的组件。我希望每次单击 JPanel
区域时触发 MouseListener
。我确实想将监听器添加到 JPanel
一次,而不是添加 n 次到 JTextArea
s.
有没有办法将 JTextArea
发送到后台,以便单击 JPanel
"through" JTextArea
?
注意:使用 JLabel
s 这没有任何特殊之处,JPanel
s 监听器总是被触发,但我更喜欢 JTextArea
s,因为换行符。
已提出解决方案 here,但它可能无法完全满足您的需求。
我不知道是否有办法绕过添加监听器 n 次,但如果没有,您可以将这个过程干净地集成到您的代码中。
例如,用专用方法添加JTextArea
s:
public void addJTextArea(JTextArea tArea){
this.add(tArea, ...);
tArea.addMouseListener(this.listener);
}
或者更透明地扩展 JTextArea
:
public class ClickableTextArea extends JTextArea {
public ClickableTextArea(MouseListener listener){
super();
addMouseListener(listener);
}
}
With JLabels this works without anything special, the JPanels Listener is always fired
这是因为默认情况下 JLabel 不包含 MouseListener,因此 MouseEvent 会向上传递到父树,直到找到确实使用 MouseListener 的组件。
在 JTextArea 的情况下,MouseListener 被添加到文本区域,因此您可以定位插入符号和 select 文本等。如果您不需要所有这些功能,您可以从每个中删除 MouseListener带有类似代码的文本区域:
JTextArea textArea = new JTextArea(...);
MouseListener[] ml = (MouseListener[])textArea.getListeners(MouseListener.class);
for (int i = 0; i < ml.length; i++)
textArea.removeMouseListener( ml[i] );
但是,由于您必须为每个文本区域执行此操作,我建议将 MouseListener 添加到每个文本区域更容易。您可以与每个文本区域共享相同的 MouseListener。