Java: JScrollPane не работает с GridBagLayout

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

5
задан jonescb 19 November 2010 в 16:04
поделиться