Java:JScrollPane不适用于GridBagLayout

时间:2010-11-19 15:59:35

标签: 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);
}

现在我有一个单独的类,它需要将我的PDFViewer添加到JFrame的子类。 只要我不使用布局并将PDFViewer直接添加到JFrame,它就可以工作。如果我甚至只是将JScrollPane添加到JPanel然后将JPanel添加到JFrame,滚动条就会消失,看起来我直接添加了JLabel。图像太大了,很容易被切断 我还需要为框架添加一些控件,所以我设置了一个非常基本的GridBagLayout,其中PDFViewer是唯一添加的组件。通过以下代码,我得到一个looks like this

的窗口
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);

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

5 个答案:

答案 0 :(得分:8)

您需要至少一个将weightx / y设置为非零值的组件才能使GridBagLayout正常工作。

您需要指定

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

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

答案 1 :(得分:1)

尝试添加:

c.fill = GridBagConstraints.BOTH;

这可确保您在调整大小时在两个方向上调整面板的大小。顺便说一下,如果这是唯一的组件,那么请考虑使用BorderLayout并将组件添加到BorderLayout.CENTER

答案 2 :(得分:1)

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

在添加viewer

之前

答案 3 :(得分:1)

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

将单元格设置为尽可能水平和垂直展开
c.weightx = 1;
c.weighty = 1;
c.fill = GridBagConstraints.BOTH;

到GridBagConstraints。

答案 4 :(得分:-1)

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