Actualmente estoy agregando JPanels a un JScrollPane presionando un botón:
Sin embargo, no puedo hacer que los paneles se apilen uno encima del otro cuando agrego más de 1 panel al panel de desplazamiento. El panel agregado anteriormente en el panel de desplazamiento parece eliminarse cuando llamo a getViewport().add().
¿Hay alguna manera de obtener un JScrollPane para guardar sus elementos secundarios y hacer que mi GUI se vea así al agregar varios JPanels con solo presionar un botón?
Clase de ventana principal:
JScrollPane trackerPanel = new JScrollPane(); trackerPanel.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); trackerPanel.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); trackerPanel.setPreferredSize(new Dimension(500, 400)); frame.getContentPane().add(BorderLayout.NORTH, trackerPanel); frame.setVisible(true); //method: called from EnterButtonListener to create and append TrackerTile to GUI public void addTrackerTile() { incrementTrackerPanelCounter(); TrackerTile trackerTile = new TrackerTile(); trackerPanel.getViewport().add(trackerTile); }Clase TrackerTile:
public class TrackerTile extends JPanel implements Scrollable { public Dimension preferredSize = new Dimension(794, 100); public TrackerTile() { setBorder(BorderFactory.createLineBorder(Color.BLACK)); } @Override public Dimension getPreferredSize() { return preferredSize; } public Dimension getPreferredScrollableViewportSize() { return new Dimension(794, 100); } public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { return 128; } public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { return 128; } public boolean getScrollableTracksViewportWidth() { return false; } public boolean getScrollableTracksViewportHeight() { return false; } }La lógica básica para crear la GUI debería ser:
JPanel somePanel = new JPanel( some layout ); JScrollPane scrollPane = new JScrollPane( somePanel ); frame.add(scrollPane. BorderLayout.CENTER); Luego, en el ActionListener que agrega nuevos paneles, simplemente haga lo siguiente:
somePanel.add( new TrackerTile() );Entonces es como agregar componentes a un panel. La única diferencia es que el panel se ha agregado a un panel de desplazamiento.
No es necesario implementar Scrollable . Pero si realmente desea personalizar las Scrollable properties , debe implementar Scrollable en "somePanel", no en los componentes individuales que agrega a "somePanel".
Otra opción es usar el Panel desplazable que implementa la interfaz Scrollable y tiene métodos que le permiten personalizar el comportamiento.