通过拖动鼠标滚动 JScrollPane (Java swing) [英] Scroll JScrollPane by dragging mouse (Java swing)
问题描述
我正在为我正在开发的游戏制作地图编辑器.JScrollPane 中有一个 JPanel,用于显示要编辑的地图.我想做的是当用户按住空格键并在 JPanel 中拖动鼠标时,JScrollPanel 将随着拖动滚动.这是我目前所拥有的:
I am making a map editor for a game I am working on. There is a JPanel in the JScrollPane that displays the map to be edited. What I would like to do is make it that when the user is holding down the Spacebar and dragging their mouse in the JPanel, the JScrollPanel will scroll along with the dragging. Here is what I have so far:
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);
}
}
});
目前它可以工作,但滚动根本不流畅.一次移动鼠标很多是好的,但是做小的拖动会使滚动窗格变得狂暴.
Currently it works but the scrolling is not smooth at all. Moving the mouse a lot at a time is fine but doing small drags makes the scrollpane go berserk.
有什么想法可以改进吗?
Any ideas how to improve this?
对于那些喜欢视觉帮助的人,这里是编辑器:
For those who enjoy a visual to help, here is the editor:
附加说明(编辑):
- 我试过
scrollPane.getViewport().setViewPosition(new Point(scrollPane.getViewport().getViewPosition().x + deltaX, scrollPane.getViewport().getViewPosition().y + deltaY));
- 鼠标缓慢移动时拖动更烦躁,而大移动时更流畅
- 我尝试使用 scrollRectToVisible 没有运气
推荐答案
好吧,结果比我简单多了……
Okay, that ended up been much simpler then I though it would be...
首先,不要弄乱 JViewport
,而是直接在充当 JScrollPane<内容的组件上使用
JComponent#scrollRectToVisible
/code>,MouseListener
应附加到其上.
First, don't mess with the JViewport
, instead, use JComponent#scrollRectToVisible
directly on the component which is acting as the contents of the JScrollPane
, onto which the MouseListener
should be attached.
以下示例仅计算用户单击的点与其拖动的量之间的差异.然后将这个增量应用到 JViewport
的 viewRect
并使用 JComponent#scrollRectToVisible
来更新可视区域,很简单 :)
The following example simply calculates the difference between the point at which the user clicked and the amount they have dragged. It then applies this delta to the JViewport
's viewRect
and uses JComponent#scrollRectToVisible
to update the viewable area, simple :)
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JLabel map;
public TestPane() {
setLayout(new BorderLayout());
try {
map = new JLabel(new ImageIcon(ImageIO.read(new File("c:/treasuremap.jpg"))));
map.setAutoscrolls(true);
add(new JScrollPane(map));
MouseAdapter ma = new MouseAdapter() {
private Point origin;
@Override
public void mousePressed(MouseEvent e) {
origin = new Point(e.getPoint());
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
if (origin != null) {
JViewport viewPort = (JViewport) SwingUtilities.getAncestorOfClass(JViewport.class, map);
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;
map.scrollRectToVisible(view);
}
}
}
};
map.addMouseListener(ma);
map.addMouseMotionListener(ma);
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}
这篇关于通过拖动鼠标滚动 JScrollPane (Java swing)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!