Problèmes avec JTable et JScrollpane taille
J'ai un JScrollPane
avec un JTable
. Dans le JTable
, j'ai d'abord 3 lignes. Plus tard, sur les lignes ajouté.
La valeur par défaut JTable
avec mes 3 lignes, c'est moche parce que JScrollPane
appels getPreferredScrollableViewportSize
du client (JTable
) et la valeur de retour est toujours le même. C'est pourquoi mon JTable
/JScrollpane
avec 3 lignes a cet espace libre, JScrollpane and
JTable n'ont pas la même taille.
Ma solution est de faire une sous-classe JTabl
e, remplacer getPreferredScrollableViewportSize
et de retourner dans cette fonction getPreferredSize();
. Maintenant, tout le JScrollPane
a exactement la taille de la ligne 3 `JTable!
Lorsqu'une ligne est ajoutée, j'ai la commande ((JComponent) scrollPane.getParent()).revalidate();
Le composant scrollpane grandit avec la table.
Tout fonctionne bien!
Mais maintenant je veux mettre une certaine mise en page pour le conteneur du composant scrollpane (panneau):
myjpanel.setLayout (new BoxLayout(contentPane, BoxLayout.Y_AXIS));
Quand j'ai ajouter cette commande toute ma solution ne fonctionne plus.
Le composant scrollpane n'a pas la taille de la 3 ligne de la table, cet espace est de nouveau là.
Pourquoi est-ce?
Quelqu'un a une solution?
CONTINUÉ
Merci camickr pour me pointer dans la bonne direction. Ma solution est la suivante:
scrollPane = new JScrollPane (table) {
public Dimension getMaximumSize () {
double height = 0;
double width = super.getMaximumSize().getWidth();
height += columnHeader.getViewSize().getHeight();
height += viewport.getView().getPreferredSize().getHeight();
height += (getViewportBorderBounds().getHeight() * -1);
Dimension returnValue = new Dimension ((int) width, (int) height);
return returnValue;
}
};
Il travaille maintenant au début.
Mais quand une ligne est ajoutée à la jtable et j'appelle revalidate(); sur le composite (conteneur parent de la scrollpanel) le jscrollpanel diminue à hauteur de 1 ligne + en-tête de!
Quiconque a une idée de ce qui est à faire dans cette situation.
CONTINUÉ
Maintenant je sais que le problème. C'est le viewportBorder. Afin d'obtenir l'ensemble, la hauteur exacte j'ai au total, la hauteur de la vue (Jtable), la hauteur de l'en-tête de colonne et la hauteur de la viewportBorder. La première fois getViewportBorderBounds().getHeight()
renvoie -3, la prochaine fois, après une nouvelle ligne est insérée dans le modèle de table - la fonction renvoie 48. Je ne comprends pas pourquoi cette fonction renvoie 48 maintenant.
Un autre point est que camickr dit que la modification de la taille de la jscrollpane défaites le but du composant scrollpane. Je ne comprends pas cette. Comment peut-on être satisfait par défaut avec un jscrollpane taille de 450 x 400 (http://www.javalobby.org/java/forums/t19559.html) même lorsque la jtable a que 3 lignes au début. Ce carnet de l'espace supplémentaire n'a pas l'air très professionnels dans mes yeux. Quiconque a une meilleure solution.
Merci beaucoup pour vos réponses
SUITE
Maintenant tout fonctionne!
Au début, j'ai tout simplement mis le jscrollpane frontière à 0 ... sp.setBorder(createEmptyBorder());
De cette façon, je éviter d'avoir ces étranges les valeurs de retour de getViewportBorderBounds().getHeight()
Wolfgang
OriginalL'auteur Wolfgang Adamec | 2011-06-04
Vous devez vous connecter pour publier un commentaire.
Le BoxLayout permet au composant de grandir jusqu'à la taille maximale de la composante. Je suppose que vous avez besoin pour remplacer la getMaximumSize() du composant scrollpane de retour de la taille préférée.
Ce genre de défaites le but du composant scrollpane. La barre de défilement est censé rester à une taille fixe, puis les barres de défilement s'affiche si nécessaire.
OriginalL'auteur camickr
J'ai eu un problème similaire - de base résultat est que je voulais une JTable dans un rouleau volet qui avait une taille minimale et maximale: quand il n'y a pas de données dans la table, on devrait avoir une ligne de hauteur de l'arrière-plan du volet affiche (pas un faux ligne, évidemment), et quand il a été de plus de 10 lignes de limiter l'affichage de la taille de la table à ceux de 10 lignes, plus de barres de défilement. Toute taille comprise entre 1 et 10 doivent d'afficher la table à pleine hauteur. La situation était un parent-enfant table, et ce fut la table d'enfant, j'ai donc dû déclencher l'enfant de redimensionnement du tableau en fonction de la table parente ligne a été cliqué. Un volet fixe la taille regardé laid en ce qu'il a pris inutilement de la place pour pousser les autres potentiellement visibles les infos sous la table enfant en dehors de la vue avec juste un espace vide.
À l'aide de la setPreferredScrollableViewportSize après la mise à jour du modèle avec les lignes enfants (et setFillsViewportHeight(vrai) bien sûr) m'a donné presque tout ce dont j'avais besoin. Sauf que la fenêtre d'affichage ne serait pas redessiner jusqu'à ce que j'ai cliqué sur elle, ou a pris le focus de la fenêtre, puis dévié de retour, il était plus ennuyeux.
La solution est super simple après la lecture de ce post: j'ai juste eu à appeler revalider sur le composant scrollpane parent, comme l'a souligné dans la solution. Il fixe parfaitement. Surtout, je voulais juste partager un cas d'utilisation où vous souhaitez que le composant scrollpane taille pour modifier dynamiquement jusqu'à une taille maximale. Swing est tellement plus simple si tout est créé à une taille fixe à jamais... à la différence de presque tous de la vie réelle des cas d'utilisation que j'ai jamais rencontré 🙂
OriginalL'auteur S. Hayes