Java:JScrollPane不';不能使用GridBagLayout

Java:JScrollPane不';不能使用GridBagLayout,java,swing,jscrollpane,Java,Swing,Jscrollpane,在我的Java应用程序中,我正在编写一个用于查看PDF文件的组件。我有一个非常巧妙的实现,用户可以点击PDF并拖动它来查看屏幕上不适合的区域。但是我的老板不喜欢,所以现在我不得不使用滚动条。所以我做了一件显而易见的事情,把它放到了一个JScrollPane中,但几乎无论我做什么,它都不起作用 PDF只是被转换成一个BuffereImage,然后我将它转换成一个ImageIcon,这样我就可以将它添加到一个JLabel中,JLabel被添加到一个JScrollPane中 我有一个PDFViewer

在我的Java应用程序中,我正在编写一个用于查看PDF文件的组件。我有一个非常巧妙的实现,用户可以点击PDF并拖动它来查看屏幕上不适合的区域。但是我的老板不喜欢,所以现在我不得不使用滚动条。所以我做了一件显而易见的事情,把它放到了一个JScrollPane中,但几乎无论我做什么,它都不起作用

PDF只是被转换成一个BuffereImage,然后我将它转换成一个ImageIcon,这样我就可以将它添加到一个JLabel中,JLabel被添加到一个JScrollPane中

我有一个PDFViewer类,它是JScrollPane的子类,重要的代码如下:

private void drawPDF() {
    PDFRenderer renderer = new PDFDrawer(pdfFile);
    BufferedImage image = renderer.makeImage(page);
    JLabel img = new JLabel(new ImageIcon(image));
    this.setViewportView(img);
}
现在我有一个单独的类,它是JFrame的子类,我需要将我的PDFViewer添加到其中。 只要我不使用布局并将PDFViewer直接添加到JFrame中,它就可以工作。如果我只是将JScrollPane添加到JPanel,然后将JPanel添加到JFrame,滚动条就会消失,看起来我只是直接添加了JLabel。此图像太大,很容易被切断。
我还需要在框架中添加一些控件,所以我设置了一个非常基本的GridBagLayout,其中PDFViewer是唯一添加的组件。通过下面的代码,我得到了一个窗口

当我只是简单地将JScrollPane添加到布局中而不是直接添加到JFrame中时,为什么JScrollPane会像这样被压缩?我发现它适用于GridLayout,但GridLayout不是我想要的。

尝试将PreferedSize(setPreferedSize())设置为要添加到ScrollPane的组件。

尝试添加:

c.fill = GridBagConstraints.BOTH;

这应确保在调整面板大小时,面板在两个方向上都已调整大小。顺便说一下,如果这是唯一的组件,那么考虑使用<代码> BooDealpule并将组件添加到<代码> BordDayStay.Center .< /P> < p>您需要至少一个Webx/y集合的组件,用于GRIDBAGRADION工作的非零值。 您需要指定

c.weightx = 1;
c.weighty = 1;
c.fill = GridBagConstraints.BOTH;
这意味着它将占用其他组件未使用的所有可用空间。我建议阅读GridBagLayout了解更多信息

c.weightx = 1.0;
c.weighty = 1.0;
c.fill = GridBagConstraints.BOTH;

在添加
查看器之前

需要设置要添加到JScrollpane的组件的preferredSize()、minimumSize()和maximumSize()。或者,可以通过添加

c.weightx = 1;
c.weighty = 1;
c.fill = GridBagConstraints.BOTH;

到GridBagConstraints。

它不再被覆盖,但我仍然没有滚动条。我把它做成了320x240作为一个测试,所以它显示了文档中心的一小部分,但我无法滚动查看其他部分。它不是唯一的组件。我添加了一些按钮来浏览页面和其他类似的东西。这是目前唯一用于测试目的的组件。谢谢。我以前做过GridBagLayouts,但我不知道你必须至少设置一个权重;我想我只是幸运而已。这个解决方案对我来说很有效,滚动条也因为一些未知的原因起作用。
c.weightx = 1;
c.weighty = 1;
c.fill = GridBagConstraints.BOTH;