2012-05-29 60 views
9

Tengo este código en el que estoy intentando colocar un Panel desplazable (JPanel) pero no lo entiendo. Aquí está mi código:¿Cómo hacer un JFrame desplazable en Java?

public class Sniffer_GUI extends JFrame { 
Canvas c = new Canvas(); 
ConnectorPropertiesPanel props; 
public Sniffer_GUI() { 
    super("JConnector demo"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    getContentPane().setLayout(new GridBagLayout()); 
    init(); 

    getContentPane().add(new JLabel("Connectors example. You can drag the connected component to see how the line will be changed"), 
         new GridBagConstraints(0, 0, 2, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 0, 5), 0, 0)); 
    getContentPane().add(initConnectors(), 
         new GridBagConstraints(0, 1, 1, 1, 1, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0)); 
    getContentPane().add(props, 
         new GridBagConstraints(1, 1, 1, 1, 0, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.VERTICAL, new Insets(5, 0, 5, 5), 0, 0)); 
    setSize(800, 600); 
    setLocationRelativeTo(null); 

} 

Gracias de antemano.

edito para agregar un código que parece funcionar parcialmente ...

public Sniffer_GUI() { 
    super("JConnector demo"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JPanel container = new JPanel(); 
    JScrollPane scrPane = new JScrollPane(container); 
    add(scrPane); 
    scrPane.setLayout(new ScrollPaneLayout()); 
    init(); 

    add(initConnectors()); 

    setSize(800, 600); 
    setLocationRelativeTo(null); 

} 

pero no es todavía desplazable, al menos de que haga su función dentro de un JScrollPane, es un buen paso.

+0

¿Dónde está el código que trata de utilizar JScrollPane? – Puce

+0

@Puce tal vez él no sabía sobre el JScrollPane. – brimborium

+0

No sé más que declarar la variable JScrollPane ... = ( –

Respuesta

0

Prueba esto:

JScrollPane sp = new JScrollPane(); 
this.add(sp). 
sp.add(*GUI elements for your applications.*) 

Algo así debería funcionar para usted. Echar un vistazo a this así:

+5

Agregar elementos al panel de desplazamiento generalmente no es lo que desea. Por lo general, pasas el panel de contenedor al constructor de JScrollPane o usas 'setViewportView' –

19

Hacer un JPanel desplazable y utilizarlo como un recipiente, algo como esto:

JPanel container = new JPanel(); 
JScrollPane scrPane = new JScrollPane(container); 
add(scrPane); // similar to getContentPane().add(scrPane); 
// Now, you can add whatever you want to the container 
+0

Tengo problemas con el diseño de scrPane cuando trato de agregar elementos, ¿cómo podría hacer algo similar al código original? –

+2

@JoeLewis En lugar de hacer lo que hace con el panel de contenido, hágalo en el contenedor descrito en la respuesta de Eng.Fouad y simplemente agregue el panel de desplazamiento al panel de contenido (deje el diseño predeterminado, BorderLayout, como el administrador de diseño del panel de contenido) –

+0

@Guillaume Polet ok perfect El código de Eng.Fouad funciona parcialmente, ya que edité en la publicación original, funciona pero aún no se puede desplazar ... –

6

Para extender @ respuesta Eng.Fouad:

public class Sniffer_GUI extends JFrame { 
    Canvas c = new Canvas(); 
    ConnectorPropertiesPanel props; 
    public Sniffer_GUI() { 
     super("JConnector demo"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel container = new JPanel(); 
     JScrollPane scrPane = new JScrollPane(container); 
     getContentPane().add(scrPane); 
     container.setLayout(new GridBagLayout()); 
     init(); 

     container.add(new JLabel("Connectors example. You can drag the connected component to see how the line will be changed"), 
          new GridBagConstraints(0, 0, 2, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 0, 5), 0, 0)); 
     container.add(initConnectors(), 
          new GridBagConstraints(0, 1, 1, 1, 1, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0)); 
     container .add(props, 
          new GridBagConstraints(1, 1, 1, 1, 0, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.VERTICAL, new Insets(5, 0, 5, 5), 0, 0)); 
     setSize(800, 600); 
     setLocationRelativeTo(null); 

    } 
} 
+0

Mi héroe ... xD Ahora solo necesito que sea verticalmente desplazable, ya que es simplemente horizontal ...: P –

+0

@JoeLewis Puede configurar las políticas de barra de desplazamiento vertical y horizontal para ajustar esto. Considere leer el [tutorial de ScrollPane] (http://java.sun.com/docs/books/tutorial/uiswing/components/scrollpane.html) y también su [JavaDoc] (http://docs.oracle.com/javase /7/docs/api/javax/swing/JScrollPane.html) –

+0

Mi problema es que iniConnectors() recupera un JPanel y necesito hacer ese panel desplazable, ya que es el más importante, sin embargo, no puedo hacerlo ni siquiera agregar initConnector a otro JScrollPane y luego hacer container.add ("el nuevo JScrollPane", etc ...); –

1

Para hacer que un componente de un JFrame desplazable, envuelva el componente en un JScrollPane:

JScrollPane myJScrollPane = new JScrollPane(myJLabel, 
     JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
     JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 

y reemplazar menti ons de myJLabel con myJScrollPane. Trabajó para mi.

+0

Gracias por mostrar JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED y JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED dentro del constructor de JScrollPane. En mi [respuesta] (http://stackoverflow.com/a/32872829/4744263) estoy usando setVerticalScrollBarPolicy y el método setHorizontalScrollBarPolicy en su lugar. Gracias por esta posibilidad. –

1

Solo estoy sonando, y no dude en corregirme si estoy fuera de la base, pero usar un JScrollPane como ese tiene una consecuencia involuntaria de requerir un cambio de tamaño de ventana más frecuente.

Por ejemplo, tenía un programa donde configuré un panel de desplazamiento de todo el marco de JF así. También tenía un JTextArea en una pestaña del marco que tenía el mismo tamaño que el panel de contenido. Esta área de texto también estaba en su propio panel de desplazamiento (esto era más un proyecto de atornillado que otra cosa). Cuando cargué contenido de un archivo para depositarlo en el área de texto, activó las barras de desplazamiento alrededor del área de texto.

El resultado fue que mi, llamémoslo innerScrollPane, ahora era más grande que el JFrame debido a las barras de desplazamiento, que no habían sido visibles antes. Esto desencadenó lo que ahora voy a llamar el outerScrollPane, para mostrar sus barras de desplazamiento, que luego cubrieron las barras de desplazamiento internas.

Esto se resolvió fácilmente agregando un argumento adicional window.pack() al final de mi método de apertura de archivos, pero solo quería lanzar esto por ahí. Las barras de desplazamiento pueden ocultar contenido en la ventana si no tienes cuidado. Pero ... bueno, hay un millón de formas de prevenir este problema, por lo que no es un gran problema. Solo algo de lo que debes estar consciente.

6

Tal vez esto ayude ...

JFrame frame = new JFrame(); 
JPanel panel = new JPanel(); 

// add something to you panel... 
// panel.add(...); 

// add the panel to a JScrollPane 
JScrollPane jScrollPane = new JScrollPane(panel); 
// only a configuration to the jScrollPane... 
jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 

// Then, add the jScrollPane to your frame 
frame.getContentPane().add(jScrollPane);