【问题标题】:Java Swing: JScrollPane doesn't work with Buffered Image in a JPanelJava Swing:JScrollPane 不适用于 JPanel 中的缓冲图像
【发布时间】:2021-07-29 15:28:54
【问题描述】:

这是我的JFrame 类,它应该显示一个高度和宽度为 2000 像素的图像。显示的区域应该只有800pxwidthheight,我希望能够使用滚动条到达2000px 的其余部分。但目前只有 800x800 像素的帧,我无法滚动图片。我可以看到滚动条,但我无法滚动它。如果我将窗口拖得更大,我只能看到更多的图片。

我的代码现在正在做什么:创建 Panel 类的实例 panel,它显示高度:2000 像素和宽度:2000 像素的图像。然后我创建一个JScrollPane 并传递panel 实例。

如果我不使用setHorizontalScrollBarPolicysetVerticalScrollBarPolicy这些行,我什至看不到滚动条。如果我使用这两行,我会看到一个用于水平和垂直滚动的滚动条,但我无法使用它们,因为它看起来好像图片已最大化。

这是我的 Frame 类:

public class Frame extends JFrame {


    public Frame() {

        Panel panel = new Panel();
       
        JScrollPane scrollPane = new JScrollPane(panel);

        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);


        add(scrollPane);
       
        this.getContentPane().setPreferredSize(new Dimension(800, 800));
        panel.generateImage();
        setVisible(true);

        pack();
    }

这是生成图像的类

public class Panel extends JPanel {

   
    private BufferedImage img;

    public Panel() {
     
        img= new BufferedImage(2000, 2000, BufferedImage.TYPE_INT_RGB);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawImage(img, 0, 0, null);
    }

public void generateImage () {

       //...image gets generated here
        repaint();
    }
}

这是一个示例,它现在的样子。这只狗只是一个例子,但它希望能让我的问题更清楚-> 我想滚动浏览图像,以便看到狗的其他部分。

【问题讨论】:

  • 不需要自定义绘画。只需使用 JLabel 来显示图像。 JLabel 将根据图像的大小自动确定其首选大小。

标签: java swing jframe jpanel jscrollpane


【解决方案1】:

您可能忘记了面板的首选大小,因为这是用于扩展 JScrollPane 的视口中保存的 JPanel“视图”的大小。考虑通过执行以下操作覆盖绘图 JPanel 中的 getPreferredSize:

@Override
public Dimension getPreferredSize() {
    if (img == null) {
        return super.getPreferredSize();
    } else {
        int w = img.getWidth();
        int h = img.getHeight();
        return new Dimension(w, h);
    }
}

当然,你必须导入java.awt.Dimension

【讨论】:

  • @Lennart:很高兴它有帮助
猜你喜欢
  • 2015-08-07
  • 2016-01-01
  • 2013-08-21
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
相关资源
最近更新 更多