Java:JScrollPane不适用于GridBagLayout

jon*_*scb 5 java swing jscrollpane

在我的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);
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个单独的类,它需要将我的PDFViewer添加到JFrame的子类.只要我不使用布局并将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);
Run Code Online (Sandbox Code Playgroud)

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

wil*_*ood 9

您需要至少一个组件,其中weightx/y设置为非零值才能使GridBagLayout正常工作.

你需要指定

c.weightx = 1;
c.weighty = 1;
c.fill = GridBagConstraints.BOTH;
Run Code Online (Sandbox Code Playgroud)

这意味着它将占用其他组件未使用的所有可用空间.我建议阅读GridBagLayout以获取更多信息.