通过拖动鼠标滚动JScrollPane(Java swing)
我正在为我正在制作的游戏制作地图编辑器。JScrollPane中有一个JPanel,显示要编辑的地图。我想做的是,当用户按住空格键并在JPanel中拖动鼠标时,JScrollPanel将随着拖动一起滚动。以下是我到目前为止的情况:
panelMapPanel.addMouseMotionListener(new MouseMotionListener(){
@Override
public void mouseDragged(MouseEvent e) {
//Gets difference in distance x and y from last time this listener was called
int deltaX = mouseX - e.getX();
int deltaY = mouseY - e.getY();
mouseX = e.getX();
mouseY = e.getY();
if(spacePressed){
//Scroll the scrollpane according to the distance travelled
scrollPane.getVerticalScrollBar().setValue(scrollPane.getVerticalScrollBar().getValue() + deltaY);
scrollPane.getHorizontalScrollBar().setValue(scrollPane.getHorizontalScrollBar().getValue() + deltaX);
}
}
});
目前它可以工作,但滚动一点也不顺畅。一次多次移动鼠标是可以的,但是做一些小的拖动会使滚动窗格变得疯狂
有什么办法可以改进吗
对于那些喜欢视觉帮助的人,以下是编辑:
添加注释(编辑):
- 我试过
scrollPane.getViewport().setViewPosition(new Point(scrollPane.getViewport().getViewPosition().x + deltaX, scrollPane.getViewport().getViewPosition().y + deltaY));
- 当缓慢移动鼠标时,拖动更烦躁,而大的移动则更平滑
- 我尝试使用scrollRectToVisible,但运气不好
# 1 楼答案
我发现这个(非常常见的)要求很难解决。这是我们在生产过程中可能超过10年的稳定解决方案
被接受的答案似乎很诱人,但一旦你开始使用它,它就会出现可用性问题(例如,尝试立即拖动到右下角,然后再向后拖动,你应该注意,在向后移动的过程中,很长一段时间内不会发生移动)
# 2 楼答案
好吧,那就简单多了,我想那会是
首先,不要弄乱
JViewport
,而是直接在作为JScrollPane
内容的组件上使用JComponent#scrollRectToVisible
,该组件上应该附加MouseListener
下面的示例只是计算用户单击的点与他们拖动的量之间的差值。然后将此增量应用于
JViewport
的viewRect
,并使用JComponent#scrollRectToVisible
更新可视区域,简单:)# 3 楼答案
我现在自己在做地图编辑器。我已经让鼠标滚动顺利地在我的工作,虽然这是一个相当详细的解决方案
我编写了两个自定义AWTEventListener,一个用于鼠标事件,另一个用于鼠标移动事件。我这样做是因为我的地图是一个定制的JComponent,因此不会填充整个视图端口。这意味着,如果光标位于组件上,则不会检测滚动窗格鼠标事件
对我来说,这工作非常顺利,内容滚动与鼠标光标在完美的锁定步骤
(我应该提到我使用鼠标滚轮点击,而不是空格键,但它很容易更改)
这是isMouseInPane方法:
这段代码可以放在任何你有权访问滚动窗格引用的地方,或者你可以创建一个自定义滚动窗格类并将其添加到那里
我希望有帮助