【发布时间】:2015-07-01 20:55:17
【问题描述】:
我正在为我正在开发的游戏制作地图编辑器。 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 没有运气
【问题讨论】:
-
您需要更改
JViewport的可视区域或位置 -
这会自动调整滚动条吗?
-
我用什么方法来改变位置? setBounds(), setAlignmentX()
-
JViewport#setViewPosition将是一个好的开始,但请记住,这是可视区域的上/左角。你也可以看看JScrollPane提供的方法,甚至只是使用JCompoint#scrollRectToVisible -
我会查看
scrollRectToVisible并在安装了MouseListener的组件上调用它,请记住,您需要计算从顶部/左侧点的偏移量和鼠标点