0

我在 Java Swing 中创建了一个可拖动的 JComponent,并希望显示它比它包含的 JFrame 更大(它应该是一个游戏地图,可以通过拖放移动)。由于我发现没有找到单独显示组件大于框架的方法,因此我尝试将其放入 JScrollPane 并删除水平和垂直滚动条,但 Eclipse 说“无效的verticalScrollBarPolicy”。有没有一种解决方法,或者甚至更好的方法来将我的 Draggable JComponent 缩放到大于 JFrame 的大小,而无需将其添加到额外的面板或组件中?

提前致谢!

4

2 回答 2

1

我试图将它放入 JScrollPane 并删除水平和垂直滚动条,但 Eclipse 说“无效的 verticalScrollBarPolicy”。

确保使用正确的变量:

scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);

一种将我的 Draggable JComponent 缩放到大于 JFrame 大小的方法

实现该getPreferredSize()方法以返回组件的适当大小。

于 2013-05-22T21:37:57.783 回答
1

您可以通过在 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);
于 2013-05-22T15:39:28.010 回答