如果已拖动或单击组件,我该如何区分?
How can I difference if a component has been dragged or clicked?
我有一个 JPanel
,里面有很多 JButton
个组件。有没有办法在按下按钮时获取面板鼠标事件?另一种观点:如何让按钮对面板鼠标事件透明?我特别需要捕获面板的 mousePressed()
事件。
编辑
上下文:
我正在通过 JScrollPane
(实际工作)拖动面板内容,以实现我需要捕获鼠标按下的点,因此面板和按钮都有 MouseListener
和 MouseMotionListener
抓住重点并做其他事情。
问题:
当我按下 -> 拖动 -> 释放鼠标按钮时,如果鼠标仍在按钮上,它会执行按钮的任何操作。所以我希望面板的鼠标侦听器是按钮的'independent',以从按钮中删除鼠标侦听器。
编辑 2
我只是在阅读我自己的问题时意识到...将 MouseListener 移除到 JButton 没有任何区别。如果鼠标悬停在按钮上,按下按钮时,无论如何都会执行 actionPerformed ...我该怎么办?
编辑 3
根据解决方案编辑问题标题。
记住在这种情况下事件执行顺序是: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
}
}
我有一个 JPanel
,里面有很多 JButton
个组件。有没有办法在按下按钮时获取面板鼠标事件?另一种观点:如何让按钮对面板鼠标事件透明?我特别需要捕获面板的 mousePressed()
事件。
编辑
上下文:
我正在通过 JScrollPane
(实际工作)拖动面板内容,以实现我需要捕获鼠标按下的点,因此面板和按钮都有 MouseListener
和 MouseMotionListener
抓住重点并做其他事情。
问题: 当我按下 -> 拖动 -> 释放鼠标按钮时,如果鼠标仍在按钮上,它会执行按钮的任何操作。所以我希望面板的鼠标侦听器是按钮的'independent',以从按钮中删除鼠标侦听器。
编辑 2
我只是在阅读我自己的问题时意识到...将 MouseListener 移除到 JButton 没有任何区别。如果鼠标悬停在按钮上,按下按钮时,无论如何都会执行 actionPerformed ...我该怎么办?
编辑 3 根据解决方案编辑问题标题。
记住在这种情况下事件执行顺序是: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
}
}