В моем 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 - это не то, что мне нужно.