Java:GridBagLayout 中无法使用 JScrollPane

6
在我的Java应用程序中,我正在编写一个组件来查看PDF文件。我有一个非常流畅的实现,用户可以单击PDF并拖动以查看屏幕上无法显示的区域。但是我的老板不喜欢它,所以现在我必须使用滚动条。因此,我做了显而易见的事情,将其放入JScrollPane中,但几乎无论我做什么,它都无法工作。

PDF只是被转换为BufferedImage,然后我将其转换为ImageIcon,以便将其添加到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是唯一要添加的组件。使用以下代码,我得到了一个窗口,看起来像这样
GridBagLayout glayout = new GridBagLayout();
GridBagConstraints c;
setLayout(glayout);
PDFViewer viewer = new PDFViewer("foo.pdf");
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.gridheight = 1;
c.gridwidth = 1;
add(viewer, c);
setVisible(true);

当我将JScrollPane简单地添加到布局而不是直接添加到JFrame时,为什么它会被压缩?我发现它可以在GridLayout中正常工作,但GridLayout不是我想要的。
5个回答

11

对于GridBagLayout起作用,您至少需要一个组件的weightx/y设置为非零值。

您需要指定:

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

谢谢。我以前一直在使用GridBagLayouts,但我不知道你必须至少设置一个权重;我猜我只是幸运而已。这个解决方案对我很有效,滚动条也出奇地工作了。 - jonescb

3
尝试添加: ```尝试添加:```
c.fill = GridBagConstraints.BOTH;

这将确保在调整大小时,您的面板在两个方向上均被重新调整大小。顺便说一句,如果这是唯一的组件,则考虑使用 BorderLayout 并将该组件添加到 BorderLayout.CENTER


这不是唯一的组件。我正在添加一些按钮来浏览页面和其他类似的东西。目前它是唯一的组件,只是为了测试目的。 - jonescb

2

您需要为添加到JScrollPane的组件设置preferredSize(),minimumSize()和maximumSize()。或者,您可以通过添加来将单元格水平和垂直扩展到最大

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

关于GridBagConstraints的使用。


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

在添加viewer之前。


-1

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


它不再被压缩了,但我仍然没有滚动条。我将其设置为320x240作为测试,因此它只显示文档中心的一小部分,但我无法滚动查看其他部分。 - jonescb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接