Java: JScrollPane ne fonctionne pas avec le GridBagLayout

Dans mon application Java, je suis en train d'écrire un composant qui est utilisé pour afficher les fichiers PDF. J'ai eu une jolie nappe de mise en œuvre où l'utilisateur peut cliquer sur le fichier PDF, puis faites-le glisser pour afficher les zones qui ne collait pas à l'écran. Mais mon patron n'aime pas ça, alors maintenant, je dois utiliser les barres de défilement. J'ai donc fait la chose la plus évidente et la mettre dans un JScrollPane, mais presque ne importe ce que je fais, il refuse de travailler.

Les fichiers PDF est converti en un BufferedImage et puis je convertir un ImageIcon afin que je puisse l'ajouter à un JLabel qui est ajoutée à un JScrollPane.

J'ai un PDFViewer de classe qui sous-classes JScrollPane, et le code est ici:

private void drawPDF() {
    PDFRenderer renderer = new PDFDrawer(pdfFile);
    BufferedImage image = renderer.makeImage(page);
    JLabel img = new JLabel(new ImageIcon(image));
    this.setViewportView(img);
}

Maintenant, j'ai une classe distincte qui sous-classes JFrame que j'ai besoin d'ajouter mon PDFViewer.
Cela fonctionne tant que je ne pas utiliser une mise en page et ajouter le PDFViewer directement à la JFrame. Même si je l'ai juste ajouter le JScrollPane pour un Composite puis ajouter le Composite à la JFrame les barres de défilement disparaissent et il semble que j'ai juste ajouté le JLabel directement. L'image est trop grande pour cela, et il se fait couper facilement.
J'ai besoin d'ajouter des contrôles à l'image en tant que bien, j'ai donc mis en place une base vraiment GridBagLayout avec le PDFViewer comme la seule composante qui a été ajoutée. Et avec le code suivant, j'obtiens une fenêtre qui ressemble à ceci.

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);

Pourquoi le JScrollPane obtenir smooshed comme ça quand je viens il suffit de l'ajouter à une mise en page plutôt que directement à la JFrame? J'ai trouvé que cela fonctionne avec GridLayout, mais un GridLayout n'est pas ce que je veux.

OriginalL'auteur jonescb | 2010-11-19