2013-06-14 2 views
1

У меня есть главный JPanel класс (не точный код):Щелкнув JPanel с внутренними компонентами

class Panel extends JPanel { 
    public void initGUI() { 
    setLayout(...); 
    JTabbedPane tabbedPane = new JTabbedPane(); 
    JPanel boxPanel = new JPanel(...); 
    tabbedPane.addTab("test", boxPanel); 
    JLabel label = new JLabel("Label") 
    boxPanel.add(label); 
    add(tabbedPane); 
    } 
} 

Я хочу, чтобы иметь возможность щелкнуть в любом месте на панели или его внутренних компонентов и вернуть панель.

public class PanelMouseAdapter extends MouseAdapter { 
    public void mouseReleased(MouseEvent e) { 
     Panel panel = (Panel)e.getSource(); 
     //do other stuff 
    } 
} 

И для каждой панели я добавляю этот прослушиватель для мыши.

Но он работает только по краям панели, любые внутренние компоненты игнорируются. Мне нужно, чтобы он мог щелкнуть в любом месте этой панели.

Мне нужно, чтобы все, что я нажимаю, вернет объект Panel (как в приемнике мыши).

Благодарим за любую отзыв.

+1

ли компоненты, принадлежащие к JPanel, имеют либо MouseListeners непосредственно добавил к ним вы или косвенно добавленные Java (например, с JButtons, JTextComponents и т. Д.)? –

+1

Если вы нацелитесь на открытие 'JpopupMenu', вы можете использовать' JComponent.setComponentPopupMenu', и он должен работать на панели и ее потомках. –

+0

Единственный слушатель, к которому я обращаюсь, прикреплен к панели –

ответ

0

Вы можете использовать Container#getComponents() для этого случая. Для примера рассмотрим фрагмент кода приведенную ниже (ищите addListeners(Container) метод):

import javax.swing.*; 
import java.awt.event.*; 
import java.util.*; 
import java.awt.*; 
class SPanel extends JPanel 
{ 
    public void init() 
    { 
     this.add(new JButton("Button")); 
     this.add(new JLabel("Click")); 
     JPanel pan = new JPanel(); 
     pan.add(new JButton("PanButton")); 
     pan.add(new JTextField(29)); 
     add(pan); 
     addListeners(this); 
    } 
    public void addListeners(Container comp) 
    { 
     Component[] components = comp.getComponents(); 
     for (Component component : components) 
     { 
      if (component instanceof Container) 
      { 
       Component[] child = ((Container)component).getComponents(); 
       if (child != null && child.length > 0) 
       { 
        addListeners((Container)component); 
       } 
      } 
      component.addMouseListener(new MouseAdapter() 
      { 
       public void mousePressed(MouseEvent evt) 
       { 
        System.out.println(evt.getSource().getClass()); 
       } 
      }); 
     } 
    } 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       SPanel sp = new SPanel(); 
       sp.init(); 
       JFrame frame = new JFrame("Frame"); 
       frame.getContentPane().add(sp); 
       frame.pack(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

Я не думаю, что это решает проблему. Вы просто добавляете mouselistener ко всем дочерним компонентам. Но если я нажму на внутренний компонент, он не вернет объект Panel, он просто вернет исходный объект, на который он нажат. Спасибо за ваш ответ. –

+0

, если бы был способ получить панель от дочернего объекта, на который было нажато, тогда это будет нормально. Думаю, мне просто нужно создать отдельные объекты для каждого элемента внутри и передать экземпляр Panel. –

+0

Что вы подразумеваете под внутренними компонентами? –

0

решаемые выпуск.

Первоначально я собирался открыть всплывающее меню, как только у меня был слушатель мыши на месте.

Но теперь я добавил JComponent.setComponentPopupMenu, как предлагал Polum, а не к панели, а к tabbedPane.

Затем я добавил слушателя во всплывающее меню, получив исходный объект через событие в методе popupMenuWillBecomeVisible, затем компонент через source.getInvoker(), затем получим родительский компонент компонента invoker и проверьте, является ли его экземпляр PairBox ,

1

Не уверен, что я понял вопрос. В вашем демо-коде отображается только одна панель, так почему вам небезразлична, на какую родительскую панель нажата? Чем лучше ваше объяснение требования, тем лучше решение, которое мы можем предоставить.

В любом случае, выезд Global Event Listeners. Это позволит вам прослушивать событие mousePressed (что лучше, чем прослушивание mouseClicked).

Далее вам нужно создать пользовательскую панель (MyCustomPanel), которую вы используете для панели верхнего уровня.

Теперь всякий раз, когда mousePressed генерируется вы можете получить источник события, а затем использовать:

MyCustomPanel panel = SwingUtilties.getAncestorOfClass(MyCustomPanel.class, (Component)event.getSource()); 
Смежные вопросы