Java: JScrollPane no funciona con GridBagLayout

En mi aplicación Java, estoy escribiendo un componente que se utiliza para ver los archivos PDF. Tuve una muy resbaladiza de la aplicación donde el usuario puede hacer clic en el PDF y arrástrelo a la vista de las zonas en la que no caben en la pantalla. Pero mi jefe no le gustó, así que ahora tengo que usar las barras de desplazamiento. Así que yo hice lo obvio y sólo tienes que poner en un JScrollPane, pero casi no importa lo que yo hago se niega a trabajar.

El PDF sólo se convierte a un BufferedImage y, a continuación, convertir a un ImageIcon para que yo pueda añadir a un JLabel que se añade a un JScrollPane.

Tengo un PDFViewer clase que las subclases JScrollPane, y el código importante está aquí:

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

Ahora tengo una clase separada que las subclases JFrame que tengo que añadir a mi PDFViewer a.
Funciona siempre como yo no uso el diseño y agregar el PDFViewer directamente al JFrame. Si yo ni siquiera basta con agregar el JScrollPane a un JPanel y, a continuación, agregue el JPanel para el JFrame las barras de desplazamiento desaparecer y parece que acabo de añadir el JLabel directamente. La imagen es demasiado grande para esto, y se corta fácilmente.

Necesito agregar controles a la trama, así que he creado un básico de GridBagLayout con el PDFViewer como el único componente que se agrega. Y con el siguiente código me sale una ventana que se parece a esto.

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

¿Por qué el JScrollPane obtener smooshed como que cuando yo simplemente añadir a una presentación en lugar de directamente a la JFrame? Me enteré de que funciona con GridLayout, pero un GridLayout no es lo que quiero.

InformationsquelleAutor jonescb | 2010-11-19

5 Kommentare

  1. 9

    Necesita al menos UNO de los componentes con el weightx/y ajustado a un valor distinto de cero para GridBagLayout a trabajar.

    Necesita especificar

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

    Esto significa que va a tomar todo el espacio disponible que no es utilizado por otros componentes. Sugiero leer sobre el GridBagLayout para obtener más información.

    • Gracias. He estado haciendo GridBagLayouts antes, pero no sabía que había que tener al menos un conjunto de peso; supongo que he tenido suerte. Esta solución funciona para mí, y las barras de desplazamiento trabajo demasiado por alguna razón desconocida.
  2. 1

    Trate de añadir:

    c.fill = GridBagConstraints.BOTH;

    Este debe asegurarse de que su panel es de tamaño en ambas direcciones cuando se cambia el tamaño. Por cierto si este es el único componente, a continuación, considere el uso de BorderLayout y agregar el componente a BorderLayout.CENTER.

    • No es el único componente. Estoy añadiendo algunos botones para ir a través de las páginas y algunas otras cosas por el estilo. Es el único componente de ahora sólo para propósitos de prueba.
  3. 1
    c.weightx = 1.0;
    c.weighty = 1.0;
    c.fill = GridBagConstraints.BOTH;

    antes de añadir el viewer.

  4. 1

    Que usted necesita para establecer el preferredSize(), minimumSize() y maximumSize() del componente que se está agregando a la JScrollpane. O usted puede configurar la celda se expanda horizontalmente y verticalmente, como la medida de lo posible mediante la adición de

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

    a la GridBagConstraints.

  5. -1

    Pruebe a establecer prefferedsize(setPrefferedSize()) para el componente que se agrega a ScrollPane.

    • No hagas eso
    • No smooshed más, pero no me he barras de desplazamiento. Me hizo 320×240 como una prueba, por lo que muestra una pequeña parte de el centro de el documento pero no puedo desplácese para ver las otras partes.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea