java swing jpanel jscrollpane layout-manager

Java JPanel dentro de JScrollPane?



swing layout-manager (5)

Echa un vistazo a la interfaz de Scrollable , esto puede ayudar con los problemas de tamaño.

Estos dos métodos pueden ser útiles:

boolean getScrollableTracksViewportWidth(); boolean getScrollableTracksViewportHeight();

Tengo un JFrame, en este JFrame tengo un JPanel que utilizo, este Panel puede ser de cualquier tamaño y lo coloqué en un JScrollpane para que me permitiera desplazarme cuando el panel es más grande que el tamaño de la pantalla de la ventana.

Lamentablemente no funciona como esperaba:

  1. Hacer que la ventana de JFrame sea más pequeña que el tamaño de JPanel no muestra barras de desplazamiento

  2. El tamaño de JScrollPane ahora parece estar bloqueado al tamaño del JPanel que le he agregado, donde antes, cambia el tamaño a los límites de su ventana de JFrame (¡¿todavía hace esto pero solo verticalmente ahora ?!)

  3. El JPanel parece asumir el tamaño del JScrollpane independientemente de lo que establezca para el tamaño preferido

Estoy seguro de que estoy haciendo algo estúpido, ¡si alguien pudiera señalar lo que estaría más 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



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


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


  • 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 nuevo GridLayout (1,1); para usted JFrame si desea que el panel de desplazamiento se expanda al expandir el marco.