大于 JFrame 的可拖动组件(JScrollPane,每侧都有不可见的滚动条)
Posted
技术标签:
【中文标题】大于 JFrame 的可拖动组件(JScrollPane,每侧都有不可见的滚动条)【英文标题】:Draggable component that is larger than JFrame (JScrollPane with invisble scrollbars on each side) 【发布时间】:2013-05-17 16:28:58 【问题描述】:我在 Java Swing 中创建了一个可拖动的 JComponent,并希望显示它比它包含的 JFrame 更大(它应该是一个游戏地图,可以通过拖放移动)。由于我发现没有找到单独显示组件大于框架的方法,因此我尝试将其放入 JScrollPane 并删除水平和垂直滚动条,但 Eclipse 说“无效的verticalScrollBarPolicy”。有没有一种解决方法,或者甚至更好的方法来将我的 Draggable JComponent 缩放到大于 JFrame 的大小,而无需将其添加到额外的面板或组件中?
提前致谢!
【问题讨论】:
【参考方案1】:我尝试将它放入 JScrollPane 并删除水平和垂直滚动条,但 Eclipse 说“无效的 verticalScrollBarPolicy”。
确保使用正确的变量:
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
一种将我的 Draggable JComponent 缩放到大于 JFrame 大小的方法
实现getPreferredSize()
方法以返回组件的适当大小。
【讨论】:
谢谢,我写了“scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);,真丢脸。不过感谢您的帮助!【参考方案2】:您可以通过在 JPanel 中实现 MouseMotionListener 来创建自己的可重用、可拖动组件。您必须跟踪鼠标位置、图像和面板尺寸,以及您希望显示的图像的当前偏移量。
private Image image;
private int imageWidth, imageHeight, width, height;
private int mouseX, mouseY;
private int offsetX, offsetY;
实现 mouseMoved 方法来简单地跟踪鼠标位置。
public void mouseMoved(MouseEvent e)
mouseX = e.getX();
mouseY = e.getY();
在 mouseDragged 方法中,更新偏移量以反映位置的变化。
public void mouseDragged(MouseEvent e)
int mx = e.getX();
int my = e.getY();
offsetX += (mouseX - mx);
offsetY += (mouseY - my);
// don't let offset exceed bounds of image
offsetX = Math.max(offsetX, 0);
offsetX = Math.min(offsetX, imageWidth - width);
offsetY = Math.max(offsetY, 0);
offsetY = Math.min(offsetY, imageHeight - height);
mouseX = mx;
mouseY = my;
repaint();
最后,重写paint方法,以正确的偏移量显示图像。
@Override
public void paint(Graphics g)
g.drawImage(image, -offsetX, -offsetY, this);
记得在构造函数中将自己添加为mouseMotionListener!
this.addMouseMotionListener(this);
【讨论】:
也可以考虑Point#translate()
谢谢,但我已经有了可拖动组件,我想知道是否可以将组件(扩展 JComponent)缩放到大于它所在的框架以上是关于大于 JFrame 的可拖动组件(JScrollPane,每侧都有不可见的滚动条)的主要内容,如果未能解决你的问题,请参考以下文章