gpt4 book ai didi

java - 如何区分组件是否已被拖动或单击?

转载 作者:行者123 更新时间:2023-12-01 09:06:44 25 4
gpt4 key购买 nike

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

编辑

上下文:我通过 JScrollPane 拖动面板内容(实际上正在工作),为了实现这一点,我需要捕获按下鼠标的点,因此面板和按钮都有 MouseListenerMouseMotionListener 来捕获点并执行其他操作。

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

编辑2

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

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

最佳答案

请记住,本例中的事件执行顺序是: mousePressed->mouseDragged->actionPerformed->mouseReleased ,我现在可以使用它,添加一个 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
}
}

关于java - 如何区分组件是否已被拖动或单击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41207933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com