Java: JScrollPane не работает с GridBagLayout - PullRequest
5 голосов
/ 19 ноября 2010

В моем 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 ]

9 голосов
/ 19 ноября 2010

Для работы GridBagLayout необходим по крайней мере ОДИН компонент с установленным ненулевым значением weightx / y.

Вам необходимо указать

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

Это означает, что потребуетсявсе доступное пространство, которое не используется другими компонентами.Я предлагаю прочитать на GridBagLayout для получения дополнительной информации.

1 голос
/ 19 ноября 2010

Вам необходимо установить предпочитаемый размер (), минимум () и максимум () для компонента, который вы добавляете в панель JScroll. Или вы можете настроить ячейку на горизонтальное и вертикальное расширение, насколько это возможно, добавив

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

к GridBagConstraints.

1 голос
/ 19 ноября 2010
c.weightx = 1.0;
c.weighty = 1.0;
c.fill = GridBagConstraints.BOTH;

перед добавлением viewer.

1 голос
/ 19 ноября 2010

Попробуйте добавить:

c.fill = GridBagConstraints.BOTH;

Это должно обеспечить изменение размера панели в обоих направлениях при изменении размера. Кстати, если это единственный компонент, рассмотрите возможность использования BorderLayout и добавления компонента в BorderLayout.CENTER.

0 голосов
/ 19 ноября 2010

Попробуйте установить prefferedsize (setPrefferedSize ()) для компонента, который вы добавляете в ScrollPane.

...