在我的Java应用程序中,我正在编写一个组件来查看PDF文件。我有一个非常流畅的实现,用户可以单击PDF并拖动以查看屏幕上无法显示的区域。但是我的老板不喜欢它,所以现在我必须使用滚动条。因此,我做了显而易见的事情,将其放入JScrollPane中,但几乎无论我做什么,它都无法工作。
现在我有一个单独的类,它是JFrame的子类,我需要将我的PDFViewer添加到其中。 只要我不使用布局并直接将PDFViewer添加到JFrame上,它就可以工作。但是,如果我将JScrollPane添加到JPanel,然后再将JPanel添加到JFrame,滚动条就会消失,并且看起来就像我直接添加了JLabel一样。由于图片太大,很容易被裁剪。
我还需要向框架中添加一些控件,因此我设置了一个非常基本的GridBagLayout,PDFViewer是唯一要添加的组件。使用以下代码,我得到了一个窗口,看起来像这样。
当我将JScrollPane简单地添加到布局而不是直接添加到JFrame时,为什么它会被压缩?我发现它可以在GridLayout中正常工作,但GridLayout不是我想要的。
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不是我想要的。