我创建的组件基本上是JPanel
完全覆盖(不可编辑的)JTextArea
。我希望每次点击MouseListener
区域时都会触发JPanel
。我确实想将监听器添加到JPanel
一次,而不是n次添加到JTextArea
。
有没有办法将JTextArea
发送到后台,所以JPanel
点击“通过”JTextArea
?
注意:对于JLabel
,这没有任何特殊效果,JPanel
的侦听器总是被触发,但我更喜欢JTextArea
,因为换行符。
答案 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。