Question

Quand la taille préférée d'un ensemble JPanel si vous ne définissez pas explicitement?

Je le code suivant:

private static class ScrollableJPanel extends JPanel implements Scrollable {
    @Override
    public Dimension getPreferredScrollableViewportSize() {
                 return getPreferredSize();
    }
            .
            .
            .
}

et ce code:

    myPanel = new ScrollableJPanel();
            // Add a bunch of controls to the panel.
    final JScrollPane scroll = new JScrollPane(myPanel);
    scroll.setAutoscrolls(true);
    scroll.setHorizontalScrollBarPolicy(
        ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

Cependant, est appelée la taille préférée des MyPanel au moment getPreferredScrollableViewportSize () semble être une valeur arbitraire, (4225, 34), et prefSizeSet ??= false.

Selon la documentation Java , c'est une façon raisonnable de définir cette méthode. Cependant, la taille réelle de MyPanel est beaucoup plus élevé que 34 pixels, le port de vue est trop petite.

Qu'est-ce que je fais mal ici? Dois-je mettre la taille préférée de MyPanel explicitement? J'ai essayé, mais je veux utiliser la taille réelle déterminée par le gestionnaire de mise en page, et pas seulement faire une proposition qui sera réécrite plus tard.

Notez que ma question n'est pas comment définir une taille exacte pour la JPanel. Je veux que le gestionnaire de mise en page pour ce faire. Et je ne veux pas avoir à définir explicitement la taille préférée. Je pensais que a également été pris en charge par le gestionnaire de mise en page. Ce que je veux savoir pourquoi le gestionnaire de mise en page n'est pas définir une valeur raisonnable pour la taille préférée lui-même pour que je puisse retourner un PreferredScrollableViewportSize raisonnable.

Était-ce utile?

La solution

La taille préférée d'un JPanel est basé sur les composants du panneau. Le gestionnaire calcule la mise en page d'une taille préférée du panneau, en fonction de la taille préférée des éléments du panneau, et si certaines de ces choses sont des panneaux, il est un calcul récursif. S'il n'y a pas de composants sous dans le panneau, la taille préférée devra être explicitement.

Autres conseils

Dans AWT (puis Swing), soit Container.getPreferredSize():

  • retourne la taille explicitement définie par setPreferredSize(),
  • ou la taille calculée par le LayoutManager si setPreferredSize() n'a pas été appelé explicitement

Par conséquent, ce qui rend getPreferredSize() dépend fortement que vous utilisez pour votre LayoutManager ScrollableJPanel.

Sachez que la plupart LayoutManagers utiliseront getPreferredSize() sur tous les enfants directs du Container sur lequel getPreferredSize() a été appelé. Ceci est un processus récursif (si les enfants ont des enfants eux-mêmes) et peuvent impliquer plusieurs LayoutManagers différents.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top