如何在面板中的自定义组件上完成鼠标单击?

时间:2014-10-13 12:56:40

标签: java swing click mouseevent

我有一个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,即使我单击所需的面板

3 个答案:

答案 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();
    }
}

<强>解释

  • 我创建了3个JLabel,为它们提供了背景颜色,以便在屏幕上显示组件的区域以及用于识别的名称。您将在此处使用自己的组件。
  • 包含标签的JPanel会注册MouseListener,检查是否有右键单击。如果是,则在面板内找到生成事件的组件 1 。然后,您可以在那里打开上下文菜单。

1 最初,我有办法在活动地点获取组件,但事实证明answer by camickr更短。 (1)