我有一个JPanel和一些自定义组件。框架中有很多这样的面板。我需要知道鼠标单击是否在自定义组件上(例如,它是一个JLabel)..... 我写了以下代码来实现这个目标:
public object getxxx(MouseEvent pEvent)
{
Point localPoint = SwingUtilities.convertPoint(pEvent.getComponent(), pEvent.getPoint(), aPanel );
if (SwingUtilities.getLocalBounds(aPanel).contains(localPoint)) // This is where im facing problem, its always false in never goes in…
{
///if clicked on the aPanel then do something
}
}
if条件始终为false,即使我单击所需的面板
答案 0 :(得分:1)
您可以将MouseListener添加到面板中。然后,您可以使用findComponentAt(...)
类的Container
方法返回单击的组件。
答案 1 :(得分:0)
您可以使用MouseListener
界面。请参阅此reference。
尝试将鼠标侦听器添加到自定义组件。
此代码段可以帮助您:
JPanel panel = new JPanel();
panel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
// **your code here**
}
});
答案 2 :(得分:0)
目前尚不清楚你已经拥有什么以及你还剩下什么,但这似乎可以满足你的需求:
public class MyFrame extends JFrame {
JPanel panel = new JPanel();
MyFrame() {
JLabel l1 = new JLabel("111");
l1.setName("111");
l1.setOpaque(true);
l1.setBackground(Color.MAGENTA);
JLabel l2 = new JLabel("222");
l2.setName("222");
l2.setOpaque(true);
l2.setBackground(Color.CYAN);
JLabel l3 = new JLabel("333");
l3.setName("333");
l3.setOpaque(true);
l3.setBackground(Color.YELLOW);
panel.add(l1);
panel.add(l2);
panel.add(l3);
panel.addMouseListener(new MyMouseListener());
panel.setName("panel");
getContentPane().add(panel);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
}
class MyMouseListener extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) { // BUTTON3 = right button
Component c = panel.getComponentAt(e.getPoint()); // compare with panel.findComponentAt
System.out.println("Open context menu for " + c.getName());
}
}
}
public static void main(String[] args) {
new MyFrame();
}
}
<强>解释强>
JLabel
,为它们提供了背景颜色,以便在屏幕上显示组件的区域以及用于识别的名称。您将在此处使用自己的组件。JPanel
会注册MouseListener
,检查是否有右键单击。如果是,则在面板内找到生成事件的组件 1 。然后,您可以在那里打开上下文菜单。1 最初,我有办法在活动地点获取组件,但事实证明answer by camickr更短。 (1)