2010-08-26 6 views
0

J'ai un JPanel principal qui implémente Scrollable et utilise un BorderLayout. Il contient un JEditorPane NORTH en lecture seule, un JPanel CENTER avec un FlowLayout par lequel les JButtons sont ajoutés dynamiquement, et un JLabel SUD, tous ajoutés dans cet ordre. Lorsque de nombreux JButtons sont ajoutés au CENTER JPanel, les boutons s'encastrent dans les lignes suivantes: le problème est que l'espace vertical dépassant une ligne occupée par le CENTER JPanel ne fait que chevaucher le JLabel SUD et ne provoque pas une croissance dynamique de JPanel. ou affichez la barre de défilement verticale. D'un autre côté, quand suffisamment de texte est ajouté à NORD JEditorPane pour qu'il s'emboîte dans les lignes suivantes, il réagit comme je le souhaite et pousse le CENTER JPanel vers le bas et affiche les barres de défilement verticales.BorderLayout: Le panneau CENTER imbriqué grandit mais ne redimensionne pas le panneau externe

Ici principale JPanel mise en œuvre Scrollable:

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

public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { 
    return Math.max(visibleRect.height * 9/10, 1); 
} 

public boolean getScrollableTracksViewportHeight() { 
    if (getParent() instanceof JViewport) { 
     JViewport viewport = (JViewport) getParent(); 
     return getPreferredSize().height < viewport.getHeight(); 
    } 
    return false; 
} 

public boolean getScrollableTracksViewportWidth() { 
    return true; 
} 

public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { 
    return Math.max(visibleRect.height/10, 1); 
} 

Qu'est-ce que je fais mal? Comment puis-je faire en sorte que le CENTER JPanel pousse le JLabel SUD vers le bas pour faire pousser l'ensemble du JPanel principal?

Répondre

1

Le problème est que FlowLayout ne recalcule pas la taille préférée lorsque les boutons sont encapsulés dans la ligne suivante. Vous devriez pouvoir utiliser le WrapLayout.

+0

Merci, cela a aidé à agrandir le panneau et à déclencher la barre de défilement verticale. Cependant, lorsque je défile vers le bas, le panneau et ses boutons planent sur le contenu au-dessus du ScrollPane au lieu de disparaître derrière ses bordures: http://www.screencast.com/t/MTUyOGRmY –

+0

Essayez d'abord le code en utilisant un panneau normal sans votre implémentation personnalisée de l'interface Scrollable. Si vous avez toujours un problème, publiez votre SSCCE (http://sscce.org) qui montre le problème. Nous ne pouvons pas deviner à quoi ressemble votre code à partir d'une image. – camickr

+0

OK, merci. FYI - après une enquête plus poussée, ce sont seulement les boutons qui ne disparaissent pas, quand je place le panneau opaque à vrai, je peux voir que le panneau lui-même disparaît derrière les limites du volet de défilement. Même problème lorsque je supprime l'implémentation Scrollable personnalisée. –