Dans mon application Java, j'écris un composant qui est utilisé pour afficher des fichiers PDF. J'ai eu une mise en œuvre assez lisse où l'utilisateur pouvait cliquer sur le PDF et le faire glisser pour voir les zones qui ne correspondent pas à l'écran. Mais mon patron n'a pas aimé, alors maintenant je dois utiliser des barres de défilement. Donc j'ai fait la chose évidente et je l'ai juste mise dans un JScrollPane, mais presque n'importe ce que je fais refuse de travailler.Java: JScrollPane ne fonctionne pas avec GridBagLayout
Le PDF vient d'être converti en un BufferedImage, puis je le convertis en ImageIcon afin que je puisse l'ajouter à un JLabel qui est ajouté à un JScrollPane.
J'ai une classe PDFViewer qui JScrollPane sous-classes, et le code important 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 séparée qui JFrame que je sous-classe besoin d'ajouter mon PDFViewer à. Cela fonctionne tant que je n'utilise pas de mise en page et que j'ajoute le PDFViewer directement au JFrame. Si j'ajoute juste le JScrollPane à un JPanel et que j'ajoute le JPanel au JFrame, les barres de défilement disparaissent et il semble que je viens d'ajouter le JLabel directement. L'image est trop grande pour cela, et elle se coupe facilement.
J'ai aussi besoin d'ajouter des contrôles au cadre, donc j'ai mis en place un GridBagLayout vraiment basique avec le PDFViewer comme seul composant ajouté. Et avec le code suivant, je reçois une fenêtre looks like this.
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 d'ajouter simplement à une mise en page au lieu de directement à la JFrame? J'ai découvert que cela fonctionne avec GridLayout, mais un GridLayout n'est pas ce que je veux.
+1 pour les railleries de boss. –