Java: JTextAreas 后面的JPanel 的MouseListener

Java: MouseListener of JPanel behind JTextAreas

我创建了一个基本 JPanel 完全覆盖(不可编辑)JTextArea 的组件。我希望每次单击 JPanel 区域时触发 MouseListener。我确实想将监听器添加到 JPanel 一次,而不是添加 n 次到 JTextAreas.

有没有办法将 JTextArea 发送到后台,以便单击 JPanel "through" JTextArea

注意:使用 JLabels 这没有任何特殊之处,JPanels 监听器总是被触发,但我更喜欢 JTextAreas,因为换行符。

已提出解决方案 here,但它可能无法完全满足您的需求。

我不知道是否有办法绕过添加监听器 n 次,但如果没有,您可以将这个过程干净地集成到您的代码中。

例如,用专用方法添加JTextAreas:

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。