2010-10-05 7 views
3

I ont un panneau contenant JPanel avec une mise en page de flux, le panneau contenant est dans un JScrollPane, le panneau contenant détient un groupe de autre JPanels, panneaux intérieurs, dedans. Tous les panneaux intérieurs ont les mêmes dimensions. Si le nombre de panneaux, puis le contenant panneau peut contenir dans sa largeur puis ils sont maillées vers le bas, et s'il y a plusieurs panneaux alors le panneau contenant peut contenir dans sa hauteur, puis les panneaux intérieurs sont alignés dans la même grille à l'exception de la dernière rangée qui est centrée avec la rangée avant la dernière.panneau Redimensionnement avec la mise en page de flux n'appelle pas les barres de défilement

Alors que je redimensionne la fenêtre du panneau contenant et étend la mise en page de flux de mise en page de son devoir effectuer, mais les barres de défilement ne semblent pas bien que la taille du panneau dépasse les limites de la JScrollPane. Comment contrôler l'aspect des barres de défilement lorsque je redimensionne dynamiquement le panneau contenant?

que pour les images, ils doivent résumer:

alt text

Après l'extension de la largeur de dialogue:

alt text

Adam

+1

Un exemple minimal de code autonome peut aider les utilisateurs à mieux comprendre votre problème. –

+0

Qu'entendez-vous par "quadrillé"? Les captures d'écran aideraient aussi. En général, vous utilisez une mise en page dynamique ou un défilement, mais pas les deux. –

+0

C'est drôle que je n'ai jamais utilisé 'FlowLayout' car c'est trop primitif pour toute interface graphique non triviale, donc je n'ai pas réalisé que vous décriviez son comportement par défaut. –

Répondre

4

Vous devez faire le panneau contenant l'outil Scrollable, et s et la taille de la fenêtre défilante préférée en fonction de la largeur.

import java.awt.*; 
import javax.swing.*; 

public class Test 
{ 
    public static void main(String args[]) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       JPanel container = new ScrollablePanel(); 
       container.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); 
       for(int i = 0; i < 20; ++i) 
       { 
        JPanel p = new JPanel(); 
        p.setBorder(BorderFactory.createLineBorder(Color.RED)); 
        p.setPreferredSize(new Dimension(50, 50)); 
        p.add(new JLabel("" + i)); 
        container.add(p); 
       } 

       JScrollPane scroll = new JScrollPane(container); 
       scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
       scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 

       JFrame f = new JFrame("Test"); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
       f.getContentPane().add(scroll);      
       f.pack(); 
       f.setSize(250, 300); 
       f.setLocationRelativeTo(null); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 

class ScrollablePanel extends JPanel implements Scrollable 
{ 
    public Dimension getPreferredSize() 
    { 
     return getPreferredScrollableViewportSize(); 
    } 

    public Dimension getPreferredScrollableViewportSize() 
    { 
     if(getParent() == null) 
      return getSize(); 
     Dimension d = getParent().getSize(); 
     int c = (int)Math.floor((d.width - getInsets().left - getInsets().right)/50.0); 
     if(c == 0) 
      return d; 
     int r = 20/c; 
     if(r * c < 20) 
      ++r; 
     return new Dimension(c * 50, r * 50); 
    } 

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

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

    public boolean getScrollableTracksViewportHeight() 
    { 
     return false; 
    } 

    public boolean getScrollableTracksViewportWidth() 
    { 
     return getParent() != null ? getParent().getSize().width > getPreferredSize().width : true; 
    } 
} 

Tous les nombres sont codés en dur pour plus de simplicité, mais vous devriez avoir l'idée.

+0

WOW, m'a pris pour toujours, le getPreferredScrollableViewportSize() n'a pas été appelé peu importe ce que j'ai fait, seul le getPreferredSize() a été appelé, donc j'ai commencé à partir de zéro, puis ça a marché, frustré j'ai comparé les deux codes, et apparemment le NetBeans génère un setPreferredSize (w, h) dans certains cas, et une fois que cela est défini, la disposition de la fenêtre ignore la méthode. Bien monté, c'était un bougre. Merci pour votre aide, je pense que j'ai tout ce dont j'ai besoin. – TacB0sS

+1

C'est pourquoi je n'utilise pas de générateur GUI :) –

Questions connexes