Java:JaxtAreas

时间:2015-07-07 09:59:23

标签: java swing jpanel jtextarea mouselistener

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

有没有办法将JTextArea发送到后台,所以JPanel点击“通过”JTextArea

注意:对于JLabel,这没有任何特殊效果,JPanel的侦听器总是被触发,但我更喜欢JTextArea,因为换行符。

2 个答案:

答案 0 :(得分:0)

提出了一个解决方案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);
    }
}

答案 1 :(得分:0)

  

使用JLabel,这没有什么特别的工作,JPanels Listener总是被解雇

这是因为默认情况下,JLabel不包含MouseListener,因此MouseEvent会向父树传递,直到找到使用MouseListener的组件为止。

在JTextArea的情况下,MouseListener被添加到文本区域,因此您可以放置​​插入符号并选择文本等。如果您不需要所有这些功能,您可以使用类似的代码从每个文本区域中删除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。