2010-11-19 6 views
3

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.

+2

+1 pour les railleries de boss. –

Répondre

7

Vous avez besoin d'au moins UN composant avec le paramètre weightx/y défini sur une valeur non nulle pour que GridBagLayout fonctionne.

Vous devez spécifier

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

Cela signifie qu'il faudra tout l'espace disponible qui ne sont pas utilisés par d'autres composants. Je suggère de lire sur GridBagLayout pour plus d'informations.

+0

+1 pour explication :) – khachik

+0

Merci. Je faisais déjà GridBagLayouts auparavant, mais je ne savais pas que vous deviez avoir au moins un ensemble de poids; Je suppose que j'ai juste eu de la chance. Cette solution fonctionne pour moi, et les barres de défilement fonctionnent aussi pour une raison inconnue. – jonescb

+0

@jonescb = pas de problème :) – willcodejavaforfood

-1

Essayez de définir prefferedsize (setPrefferedSize()) sur le composant que vous ajoutez à ScrollPane.

+0

Non, ne le faites pas – willcodejavaforfood

+0

Il n'est plus smooshed, mais je n'ai toujours pas les barres de défilement.Je l'ai fait 320x240 comme un test, donc il montre une petite partie du centre du document mais je ne peux pas faire défiler pour voir d'autres parties. – jonescb

1

Essayez d'ajouter:

c.fill = GridBagConstraints.BOTH; 

Cela devrait faire en sorte que votre panneau est redimensionnée dans les deux sens lorsque vous redimensionnez. Incidemment, si c'est le seul composant, pensez à utiliser BorderLayout et à ajouter le composant à BorderLayout.CENTER.

+0

Ce n'est pas le seul composant. J'ajoute quelques boutons pour parcourir les pages et d'autres trucs comme ça. C'est le seul composant actuellement juste à des fins de test. – jonescb

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

avant d'ajouter le viewer.

1

Vous devez définir les paramètres preferredSize(), minimumSize() et maximumSize() du composant que vous ajoutez au JScrollpane. Ou vous pouvez définir la cellule d'étendre horizontalement et verticalement dans la mesure du possible en ajoutant

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

aux GridBagConstraints.