在我的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不是我想要的。
答案 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的组件。