2

我有一个主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 对象(如在鼠标侦听器中)。

感谢您的任何反馈。

4

3 回答 3

1

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

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

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

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

MyCustomPanel panel = SwingUtilties.getAncestorOfClass(MyCustomPanel.class, (Component)event.getSource());
于 2013-06-15T00:49:08.117 回答
0

解决了问题。

最初,一旦我有了鼠标监听器,我就会打开一个弹出菜单。

但是现在我按照 Polum 的建议添加了 JComponent.setComponentPopupMenu,不是添加到面板,而是添加到 tabbedPane。

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

于 2013-06-15T00:23:34.250 回答
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);
            }
        });
    }
}
于 2013-06-14T22:02:18.560 回答