2009-09-06 16 views
12

¿Cómo hacer un JPanel desplazable? He implementado la interfaz desplazable sin embargo, cuando se añade al panel que contiene conJPanel desplazable

tabbedPane.add("Editor", new JScrollPane(storeyEditor = new MNScrollablePanel())); 

nada funciona

Código:

public class MNScrollablePanel extends JPanel implements Scrollable { 

    public Dimension getPreferredScrollableViewportSize() { 
     return getPreferredSize(); 
    } 

    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { 
     return 10; 
    } 

    public boolean getScrollableTracksViewportHeight() { 
     return false; 
    } 

    public boolean getScrollableTracksViewportWidth() { 
     return false; 
    } 

    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { 
     return 10; 
    } 
} 

Respuesta

8

Usted tiene que usar un JScrollPane. Y luego llame al setViewportview(Component);

Usted no tiene que poner en práctica desplazable, JPanel es allready desplazable

+3

Puede agregar cualquier componente a un JScrollPane, implemente o no Scrollable, pero implementar Scrollable le dará más control. JPanel no implementa Scrollable, por lo que debe subclasificarlo si desea tener más control sobre cómo se comporta el panel de desplazamiento cuando visualiza el panel. –

+0

(O puede establecer propiedades en 'JScrollPane' /' JScrollBar's sin implementar nada.) –

+0

@Dan: Sí, pero nunca dije 'implementa' –

1

Como se menciona en todos los demás publicación no hay ninguna razón para implementar la interfaz desplazable a sí mismo. Sin embargo, si solo estás jugando, entonces el código básico publicado parece razonable. Sin embargo, no publicó su programa de demostración que muestra cómo usa este código. En el futuro, publique un SSCCE con su pregunta. Si no sabe qué es un SSCCE, busque en la web.

Una vez que el posible problema es que las barras de desplazamiento aparecen automáticamente cuando el "tamaño preferido" del componente agregado a la ventana gráfica del panel de desplazamiento es mayor que el tamaño del panel de desplazamiento.

Si está haciendo una pintura personalizada en el panel, es su responsabilidad establecer el tamaño preferido del panel a medida que cambia. Si está utilizando un panel con componentes y un administrador de disposición, entonces no tiene que preocuparse por esto. Pero si usa componentes con un administrador de diseño nulo, también tendrá problemas.

Es por eso que necesitamos un SSCCE porque no conocemos el contexto de cómo está utilizando el panel.

0

Tengo una nueva solución para usted.

Yo creo que hay que usar este código:

storyEditor = new JPanel(); 
storyEditor.setPreferredSize(new Dimension(..., ...)); // Insert Here your size for the editor 
JScrollPane scroller = new JScrollPane(storyEditor); 
tabbedPane.add("Editor", scroller)); 
frame.setSize(frame.getWidth()+1, frame.getHeight()); // frame is the JFrame where the tabbed pane is into 
// Maybe you can replace "frame" with "this" 
// You need to resize your frame. Why, I don't know... 
frame.pack(); 
// Your original size will be restored by calling pack 

Ésta era una solución para mí. ¡Espero que lo hagas!

22

Se trabajó conmigo como esto ....

JPanel test = new JPanel(); 
test.setPreferredSize(new Dimension(2000,2000)); 
JScrollPane scrollFrame = new JScrollPane(test); 
test.setAutoscrolls(true); 
scrollFrame.setPreferredSize(new Dimension(800,300)); 
this.add(scrollFrame); 
+0

Tenga en cuenta que no tiene control sobre el incremento de desplazamiento, es decir, cada clic en el botón de desplazamiento o cada vuelta de rueda del mouse da como resultado desplazar un píxel que necesita superar, en caso de que lo desee, implementando 'Desplazable'. –

1

JPanel no implementa desplazable. Es mejor usar JXPanel desde SwingX, que implementa Scrollable y tiene muchas más funciones.