单击带有内部组件的JPanel

时间:2013-06-14 20:09:37

标签: java swing jpanel mouse-listeners

我有一个主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);
  }
}

我希望能够单击Panel或其内部组件的任何位置并返回Panel。

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

对于每个Panel,我都添加了这个鼠标监听器。

但它只适用于Panel的边缘,任何内部组件都会被忽略。我需要它才能点击该面板中的任何位置。

我需要保持在我点击它的任何地方都会返回Panel对象(就像在鼠标监听器中一样)。

感谢您的反馈。

3 个答案:

答案 0 :(得分:1)

不确定我理解这个问题。您的演示代码只显示一个面板,那么您为什么要关注单击哪个父面板?您对要求的解释越好,我们可以提供更好的解决方案。

无论如何,请查看Global Event Listeners。这将允许您监听mousePressed事件(这比监听mouseClicked更好)。

接下来,您需要创建一个用于顶级面板的自定义面板(MyCustomPanel)。

现在,每当生成mousePressed时,您都可以获取事件的来源,然后使用:

MyCustomPanel panel = SwingUtilties.getAncestorOfClass(MyCustomPanel.class, (Component)event.getSource());

答案 1 :(得分: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);
            }
        });
    }
}

答案 2 :(得分:0)

解决了问题。

最初,当我有鼠标监听器时,我打算打开一个弹出菜单。

但是现在我添加了JComponent.setComponentPopupMenu作为Polum建议,而不是面板而是tabbedPane。

然后我在弹出菜单中添加了一个监听器,通过popupMenuWillBecomeVisible方法中的事件获取源对象,然后通过source.getInvoker()获取组件,然后获取调用者组件的父级并检查它是否是PairBox的实例。