简体   繁体   中英

How can I difference if a component has been dragged or clicked?

I have a JPanel with many JButton components inside. Is there a way to get the panel mouse event when a button is pressed? Another point of view: How to make button transparent to panel mouse event? I specifically need to capture mousePressed() event of panel.

EDIT

Context: I'm dragging the panel content through a JScrollPane (actually working), to accomplish that I needed to capture the point where mouse is pressed, so both panel and buttons have MouseListener and MouseMotionListener to capture the point and do other stuff.

Issue: When I press -> drag -> release the mouse button, if the mouse is still over the button it executes whatever the button does. So I want the mouse listener of the panel to be 'independent' of the button, to remove the mouse listener from the buttons.

EDIT 2

I just realize reading my own issue... that it will make no difference removing MouseListener to the JButton. When pressing the button if the mouse it stil over it, the actionPerformed will be executed anyway...What can I do?

EDIT 3 Edited question title, according to the solution.

Kipping in mind that the event execution order in this case is: mousePressed->mouseDragged->actionPerformed->mouseReleased , I get it working at the moment, adding a boolean:

@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
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM