我有一个主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对象(就像在鼠标监听器中一样)。
感谢您的反馈。
答案 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的实例。