2012-02-22 19 views
17

Tengo un JFrame, en este JFrame tengo un JPanel del que dibujo, este Panel puede ser de cualquier tamaño, así que lo coloqué en un JScrollpane para permitirme desplazarme cuando el panel es más grande que el tamaño de la pantalla de la ventana.Java JPanel dentro de JScrollPane?

Desafortunadamente no funciona como esperaba:

  1. Hacer la ventana JFrame es inferior al del JPanel no muestra barras de desplazamiento

  2. El tamaño JScrollPane ahora parece estar bloqueado en el tamaño de la JPanel Lo he agregado, donde antes cambió su tamaño a los límites de su ventana JFrame (todavía hace esto pero solo verticalmente ?!)

  3. El JPanel parece asumir el tamaño del JScrollpane dless de lo que se propuso para el tamaño preferido

Estoy seguro de que estoy haciendo algo estúpido, si alguien puede señalar lo que estaría muy agradecido!

JPanel _ImageCanvas = new JPanel(); // 'Canvas' to draw on 
JScrollPane _ScrollPane = new JScrollPane(); 

// set size of 'canvas' 
_ImageCanvas.setMinimumSize(new Dimension(100,100)); 

// Scroll pane smaller then the size of the canvas so we should get scroll bars right? 
_ScrollPane.setMinimumSize(new Dimension(50,50)); 

// Add a border to 'canvas' 
_ImageCanvas.setBorder(BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0))); 

_ScrollPane.setViewportView(JPanel); 

Muchas gracias

David

+8

por favor, aprender las convenciones de nombres de Java y se adhieren a ellos – kleopatra

+2

Cuando dice _ScrollPane.setViewportView (JPanel); Supongo que te refieres a la instancia de JPanel _ImageCanvas –

Respuesta

13

setPreferredSize() es el truco, setMinimumSize() e incluso setSize() en el componente serán ignorados por JScrollPane. Aquí hay un ejemplo de trabajo usando un borde rojo.

import java.awt.*; 

import javax.swing.*; 

public class Scroller extends JFrame { 

    public Scroller() throws HeadlessException { 
     final JPanel panel = new JPanel(); 
     panel.setBorder(BorderFactory.createLineBorder(Color.red)); 
     panel.setPreferredSize(new Dimension(800, 600)); 

     final JScrollPane scroll = new JScrollPane(panel); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new BorderLayout()); 
     add(scroll, BorderLayout.CENTER); 
     setSize(300, 300); 
     setVisible(true); 
    } 

    public static void main(final String[] args) throws Exception { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Scroller().setVisible(true); 
      } 
     }); 
    } 
} 
0

Por lo que yo recuerdo hay 2 opciones:

Para más detalles, ver el Javadoc: http://docs.oracle.com/javase/7/docs/api/javax/swing/JScrollPane.html

+0

Hola Puce, gracias por las sugerencias, resulta que necesitaba agregar un jPanel "holder" al scrollView y luego darle un administrador de diseño para obtener el efecto deseado. – FiniteRed

1
  • Establecer el tamaño preferido en el lienzo.
  • Aumentar las dimensiones 100,100 es demasiado pequeño al menos en mi computadora.
  • Es posible que desee utilizar el nuevo GridLayout (1,1); para usted JFrame si desea que el panel de desplazamiento se expanda al expandir el marco.
7
// suggest a size of 'canvas' 
_ImageCanvas.setPreferredSize(new Dimension(100,100)); 

// Scroll pane smaller then the size of the canvas so we should get scroll bars right? 
_ScrollPane.setPreferredSize(new Dimension(50,50)); 

// ..later 
_Frame.pack(); 
+0

frame.pack(); Lo he amado –

0

retirar la interfaz Scrollable, esto puede ayudar con los problemas de tamaño.

Estos dos métodos quizá útil:

boolean getScrollableTracksViewportWidth(); 

boolean getScrollableTracksViewportHeight();