有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有内部组件的java单击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对象(就像在鼠标侦听器中一样)

谢谢你的反馈


共 (2) 个答案

  1. # 1 楼答案

    我不太明白这个问题。您的演示代码只显示一个面板,那么您为什么关心单击哪个父面板呢?你对需求的解释越好,我们就能提供更好的解决方案

    无论如何,看看Global Event Listeners。这将允许您监听鼠标按下的事件(这比监听鼠标按下的事件更好)

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

    现在,无论何时生成mousePressed,您都可以获取事件源,然后使用:

    MyCustomPanel panel = SwingUtilties.getAncestorOfClass(MyCustomPanel.class, (Component)event.getSource());
    
  2. # 2 楼答案

    解决了这个问题

    最初,我打算在鼠标侦听器就位后打开一个弹出菜单

    但现在我添加了JComponent。按照Polum的建议设置ComponentPopupMenu,而不是面板,而是选项卡窗格

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