【问题标题】:How can I difference if a component has been dragged or clicked?如果组件已被拖动或单击,我如何区分?
【发布时间】:2016-12-18 21:30:39
【问题描述】:

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

编辑

背景: 我正在通过JScrollPane(实际工作)拖动面板内容,以完成我需要捕获按下鼠标的点,因此面板和按钮都有MouseListenerMouseMotionListener 来捕获点并执行其他东西。

问题: 当我按下 -> 拖动 -> 释放鼠标按钮时,如果鼠标仍在按钮上方,它将执行按钮的任何操作。所以我希望面板的鼠标侦听器与按钮“独立”,以便从按钮中删除鼠标侦听器。

编辑 2

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

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

【问题讨论】:

  • 可能与以下内容重复:stackoverflow.com/questions/16431455/…
  • 为什么需要它?你想达到什么目标?
  • @SergiyMedvynskyy 提出了几个很好的问题。另见What is the XY problem?
  • “我正在通过JScrollPane 拖动面板内容” JScrollBar 对此更好。它代表了最终用户的“最不意外的路径”,并使其余部分变得多余。
  • @Andrew Thompson 我正在使用触摸屏,为了便于访问,拖动内容会更容易,

标签: java swing mouseevent


【解决方案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
    }
}

【讨论】:

    猜你喜欢
    • 2014-09-20
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多