2010-04-26 3 views
9

J'ai un JScrollpane qui a un JPanel à l'intérieur (et le panneau contient quelques JLabel s).JScrollpane doit rétrécir sa largeur

Je veux redimensionner le volet de défilement pour modifier réellement sa taille (éventuellement inférieure à la taille préférée des composants internes), et pas seulement la taille de la fenêtre.

L'objectif est que le panneau interne disparaisse gracieusement (en utilisant des priorités de rétrécissement spécifiques et autres dans ma migration) lorsque l'utilisateur rétrécit le panneau de défilement trop petit.

+0

La question est tout à fait clair pour moi, mais vous pourriez peut-être suivre l'évolution de la taille de la JScrollPane et de réagir quand il devient inférieure à une certaine limite (le cacher en douceur). –

+0

Il semble que faire quelque chose stupide de relais quand la taille des changements 'JViewport' est sur le seul moyen de le faire. (Pour simplifier, j'ai essentiellement une table à l'intérieur de la fenêtre d'affichage d'un scrollpane.) Je veux que le scrollpane détermine quelles lignes de la table sont montrées, mais je ne veux pas qu'elle affecte les colonnes montrées. est d'attribuer une priorité de rétrécissement pour les différentes colonnes afin que la réduction de la taille horizontale de la zone de texte commence à tronquer des colonnes spécifiques.) – Mike

Répondre

14

La meilleure méthode consiste probablement à avoir toujours la même largeur du composant contenu que la fenêtre. Pour ce faire, le premier composant contenu (celui qui est l'enfant à JViewPort, passé dans le constructeur JScrollPane ou défini comme viewportView) doit implémenter javax.swing.Scrollable. La méthode clé est getScrollableTracksViewportWidth, qui doit renvoyer true.

Voici un JPanel scrollable rapide et sale:

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

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

    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { 
     return ((orientation == SwingConstants.VERTICAL) ? visibleRect.height : visibleRect.width) - 10; 
    } 

    public boolean getScrollableTracksViewportWidth() { 
     return true; 
    } 

    public boolean getScrollableTracksViewportHeight() { 
     return false; 
    } 
} 
+0

Génial, merci! Je n'étais pas au courant de l'interface Scrollable. – Mike

+0

Encore une chose. J'ai seulement obtenu cette solution fonctionnant avec 'BorderLayout'. La valeur par défaut 'FlowLayout' ne fonctionne pas correctement pour les vues très larges. –

+0

Ne pas utiliser la disposition de flux. Il ne convient que pour les démonstrations et les barres de boutons. Il est maintenant possible de suivre la largeur d'une disposition de flux. – shemnon

Questions connexes