大于 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,每侧都有不可见的滚动条)的主要内容,如果未能解决你的问题,请参考以下文章

React - 具有输入的可拖动组件在单击该输入时失去焦点的能力

java Swing组件随着窗口拖动等比移动或等比放大

如何在 Java 中将多个可拖动图像添加到 JFrame?

拖动和调整未修饰的JFrame

JFrame从自定义按钮拖动不流畅

如何将多个 MouseListeners 添加到单个 JFrame?