2010-10-05 4 views
1

Pour définir la taille minimale avec succès, je dois faire ce qui suit:Java Swing: Comment définir une dimension minimale (des deux) pour les composants?

// setting minimal width AND height 
Dimension min = new Dimension(100, 100); 
comp.setMinimumSize(min); 
comp.setPreferredSize(min); 
comp.setSize(min); 

Quand je suis parti d'une sortie ligne ne fonctionne pas, ce qui est étrange, mais ce n'est pas le point.

Que dois-je faire pour limiter juste un de deux dimensions (largeur ou hauteur) et laissez le composant et/ou le gestionnaire de mise en page décident automatiquement de la dimension non spécifiée ?

Lorsque j'utilise une très petite valeur pour cette dimension que je ne veux pas limiter, de nombreux composants sont affichés incorrectement (c'est-à-dire trop petits).

Répondre

4

Par défaut (si setMinimumSize n'a pas été appelée sur le composant) getMinimumSize délègue au directeur de la présentation du composant, de sorte que vous pouvez essayer de redéfinir la méthode getMinimumSize comme suit:

public Dimension getMinimumSize() 
{ 
    return new Dimension(minWidth, super.getMinimumSize().height); 
} 

Si vous faites cela, rappelez-vous que vous ne devez pas appeler setMinimumSize sur le composant.

+0

Je ne comprends pas: vous dire que je devrais remplacer 'getMinimumSize' du composant, ou voulez-vous dire le gestionnaire de mise en page? Merci! –

+0

Substituez la méthode dans le composant. Il va déléguer au gestionnaire de disposition tant que 'setMinimumSize' n'a pas été appelé sur le composant. En remplaçant la façon dont je l'ai décrit, vous obtenez un "comportement par défaut" pour la hauteur, mais vous pouvez spécifier explicitement une largeur minimale. – Grodriguez

0

Je propose une approche par moi-même:

Pour les gestionnaires de mise en page qui alignent tout un axe (comme BoxLayout), on peut spécifier « dimension non définie » set à Integer.MAX. C'est étrange, mais ça marche. Il semble que l'axe opposé à l'axe d'alignement soit ignoré (à moins qu'il ne soit trop petit, comme mentionné dans la question).

private final static int UNSPECIFIED_DIMENSION = Integer.MAX_VALUE; 

public static void setMinimalDimension(Component comp, int width, int height) { 
    Dimension dim = new Dimension(width, height); 
    comp.setMinimumSize(dim); 
    comp.setPreferredSize(dim); 
    comp.setSize(dim); 
} 

public static void setMinimalWidth(Component comp, int width) { 
    setMinimalDimension(comp, width, UNSPECIFIED_DIMENSION); 
} 

public static void setMinimalHeight(Component comp, int height) { 
    setMinimalDimension(comp, UNSPECIFIED_DIMENSION, height); 
} 

Fonctionne, comme mentionné, avec des gestionnaires de disposition à alignement d'axes.

Oui, il y va un autre mystère de Java Swing ...

Questions connexes