如果拖动或点击某个组件,我该如何区别?

时间:2016-12-18 11:34:29

标签: java swing mouseevent

我的JPanel里面有很多JButton个组件。有没有办法在按下按钮时获取面板鼠标事件?另一种观点:如何使按钮对面板鼠标事件透明?我特别需要捕获mousePressed()小组事件。

修改

上下文 我通过JScrollPane(实际工作)拖动面板内容,以实现我需要捕获鼠标按下的位置,因此面板和按钮都有MouseListener和{{1抓住要点并做其他事情。

问题: 当我按 - >拖动 - >释放鼠标按钮,如果鼠标仍然在按钮上,它会执行任何按钮。所以我希望面板的鼠标监听器是独立的'按钮,从按钮中删除鼠标监听器。

编辑2

我只是意识到阅读我自己的问题......将MouseListener移除到JButton没有区别。当按下按钮时,如果鼠标悬停在按钮上,则无论如何都会执行actionPerformed ......我该怎么办?

编辑3 根据解决方案编辑问题标题。

1 个答案:

答案 0 :(得分:1)

请记住,在这种情况下,事件执行顺序是:mousePressed-> mouseDragged-> actionPerformed-> mouseReleased,我现在让它工作,添加一个布尔值:

@Override
public void mousePressed(MouseEvent e) {
        origin = new Point(e.getPoint());
}
//each time the user stops dragging set dragged to false
@Override
public void mouseReleased(MouseEvent arg0) {
     dragged = false;
}

@Override
public void mouseDragged(MouseEvent e) {

        dragged=true;
        if(((Component) e.getSource()).getParent().equals(myPanel)
                || e.getSource().equals(myPanel)){
          if (origin != null) {
            JViewport viewPort = (JViewport) SwingUtilities.getAncestorOfClass(JViewport.class, myPanel);
            if (viewPort != null) {
                int deltaX = origin.x - e.getX();
                int deltaY = origin.y - e.getY();

                Rectangle view = viewPort.getViewRect();
                view.x += deltaX;
                view.y += deltaY;
                myPanel.scrollRectToVisible(view);
            }
        }
}
@Override
public void actionPerformed(ActionEvent e){

    //stuff do detect the button...
    //..in case there is more than one panel, if the component belong to myPanel and dragg is false 
    if(((Component) e.getSource()).getParent().equals(myPanel)&&  dragged==false ){
    //do stuff
    }
}