2015-07-07 4 views
1

Я создал компонент, который в основном является JPanel полностью покрытым (нередактируемым) JTextArea s. Я хочу, чтобы MouseListener был запущен каждый раз, когда нажимается область JPanel. Я хочу добавить Listener один раз к JPanel вместо n раз к JTextArea s.Java: MouseListener JPanel за JTextAreas

Есть ли способ отправить JTextArea s на задний план, так что JPanel нажал «через» JTextArea?

Примечание: С JLabel s это работает без каких-либо специальных, JPanel s Слушатель всегда уволен, но я предпочитаю JTextArea s, из-за разрыва линии.

ответ

0

С JLabels это работает без чего-либо, приемник JPanels всегда увольняется

Это потому, что по умолчанию 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 с каждой текстовой областью.

+0

Вот почему, спасибо за это! – user4591830

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); 
    } 
} 
+0

Спасибо за ваш ответ! Я бы предпочел другое решение, так как моя программа будет достаточно интенсивной, но, поскольку ее нет, я сделаю так. – user4591830

Смежные вопросы