Java 拖动JPanel
我在尝试拖动JPanel时遇到问题。如果我纯粹在MouseDragged中实现它,则如下所示:Java 拖动JPanel,java,events,swing,mouse,drag,Java,Events,Swing,Mouse,Drag,我在尝试拖动JPanel时遇到问题。如果我纯粹在MouseDragged中实现它,则如下所示: public void mouseDragged(MouseEvent me) { me.getSource().setLocation(me.getX(), me.getY()); } 我得到一个奇怪的效果,移动的对象一直在两个位置之间反弹(生成更多的“拖动”事件)。如果我按照中所述的方式进行,但是: public void mouseDragged(MouseEvent me) {
public void mouseDragged(MouseEvent me) {
me.getSource().setLocation(me.getX(), me.getY());
}
我得到一个奇怪的效果,移动的对象一直在两个位置之间反弹(生成更多的“拖动”事件)。如果我按照中所述的方式进行,但是:
public void mouseDragged(MouseEvent me) {
if (draggedElement == null)
return;
me.translatePoint(this.draggedXAdjust, this.draggedYAdjust);
draggedElement.setLocation(me.getX(), me.getY());
}
我得到的元素弹跳效果要小得多,但它仍然可见,并且元素的移动方式仅为鼠标指针的½。为什么会发生这种情况/我如何解决这种情况?试试这个
final Component t = e.getComponent();
e.translatePoint(getLocation().x + t.getLocation().x - px, getLocation().y + t.getLocation().y - py);
并添加此方法:
@Override
public void mousePressed(final MouseEvent e) {
e.translatePoint(e.getComponent().getLocation().x, e.getComponent().getLocation().y);
px = e.getX();
py = e.getY();
}
我不知道你是否可以用鼠标标记的事件来完成。在过去,我使用mousePressed保存原始点,并拖动鼠标以获取当前点。在这两种情况下,我将点转换到屏幕上的位置。然后,两个点之间的差异很容易计算,并且可以适当地设置位置
我的通用类就是这个类。好的。老问题,但如果有人遇到像我这样的问题,这可以相对简单地解决。为了在
JFrame
中拖动JPanel
,我做了:
@Override
public void mousePressed(MouseEvent e) {
if (panel.contains(e.getPoint())) {
dX = e.getLocationOnScreen().x - panel.getX();
dY = e.getLocationOnScreen().y - panel.getY();
panel.setDraggable(true);
}
}
@Override
public void mouseDragged(MouseEvent e) {
if (panel.isDraggable()) {
panel.setLocation(e.getLocationOnScreen().x - dX, e.getLocationOnScreen().y - dY);
dX = e.getLocationOnScreen().x - panel.getX();
dY = e.getLocationOnScreen().y - panel.getY();
}
}
关键是使用
.getLocationOnScreen()
并在每次调用mouseDragged
结束时更新调整。如果拖动导致查看区域滚动,您的方法(在屏幕上保存位置)是否会中断?必须承认我从未尝试在滚动窗格中拖动组件。因此,被拖动的元素跳到窗口的左上角-但拖动至少是可预测的…实际上-这在鼠标按下的情况下不需要翻译。还是不知道为什么。