【问题标题】:JScrollPane with JPanel inside doesn't show scroll bar when picture is bigger当图片较大时,内部带有 JPanel 的 JScrollPane 不显示滚动条
【发布时间】:2012-09-14 20:33:42
【问题描述】:

我正在制作一个实用程序来为我的游戏在地图中定义立足点,并且我正在 JScrollPane 内的 JPanel 内显示地图的预览。当地图大于 JScrollPane 时,我希望能够滚动。我该怎么做?

这是一张照片

Bigger version

地图的图像适合滚动窗格,但图像实际上更大,所以我们看不到整个地图。

一些代码:

在滚动窗格中保存图像的 JPanel 类

public class MapDisplay extends JPanel {

public MapDisplay() {
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponents(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(new Color(0xDFDFDF));
    g2d.fillRect(0, 0, 2000, 2000);
    if (mapinfo != null) {
    if (mapinfo.img != null) {
        g2d.drawImage(mapinfo.img, 0, 0, null);
    }
    }
    repaint();
}
}

scrollPane 的声明

final JScrollPane scrollPane_1 = new JScrollPane(mapDisplay);

scrollPane_1.setBounds(10, 11, 989, 553);
getContentPane().add(scrollPane_1);
add(scrollPane_1);

【问题讨论】:

  • "How should i do that?" -- 通过正确编码。尽管没有代码,但很难知道自己做错了什么。也许您正在尝试设置由 JScrollPane 保存并显示图片的组件的大小?也许您没有将 JScrollPane 添加到 GUI 中?在这里很难猜。
  • 我要添加一些代码,请稍等。
  • 试试这个ImageApp。
  • 您对setBounds(...) 的调用让我担心,并暗示您可能没有使用布局管理器,这是一件危险的事情,很可能是您的问题的根源。我建议您使用使用适当布局管理器的嵌套容器,我敢打赌,如果不能解决您的问题,这将极大地帮助您。另外,不要在绘图方法中调用repaint(),因为这是一件非常糟糕的事情。
  • @NicolasMartel:但这会损害您的 GUI 滚动能力。您最好使用布局管理器,因为它们会为您完成布局工作,这使得 GUI 修改变得更加容易,并使您的 GUI 在任何操作系统/平台中看起来都很好。

标签: java swing jpanel jscrollpane absolutelayout


【解决方案1】:

MapDisplay 必须“告诉”JScrollPane 它想要多大。您可以通过实现MapDisplay 的getPreferredSize 方法来做到这一点。

public Dimension getPreferredSize() {
    return new Dimension(widthOfMap, heightOfMap);
}

此外,不要从 paintComponent() 方法内部调用 repaint(),因为这会导致无限循环。

【讨论】:

  • 谢谢,效果很好。不过有一件事,我假设 getPreferredSize 在程序启动时只调用一次。有没有办法在以后更新和调用它以重新计算大小?
  • getPreferedSize 在需要重新布局的非容器时调用。对 invalidate 的调用通常会将组件(和父组件)标记为需要更新
猜你喜欢
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多