JTable et JScrollPane

cs_hadriel Messages postés 4 Date d'inscription jeudi 15 avril 2004 Statut Membre Dernière intervention 20 avril 2004 - 19 avril 2004 à 09:36
cs_hadriel Messages postés 4 Date d'inscription jeudi 15 avril 2004 Statut Membre Dernière intervention 20 avril 2004 - 20 avril 2004 à 10:56
Je soufaite faire un fenetre en deux parties :
à gauche, l'affichage d'une JTable, à droite des donnés représentées par une case.

Pour le moment je tente (désespéremment) d'afficher la JTable correctement dans un JScrollPane avec deux boutons sur la droite. Le problème, c'est que si la table est de taille inférieur à la fenêtre, elle contient entièrement dans le JScrollPane, les barres de défillement sont bien masqués, mais par contre elle est pas centrée dans le JScrollPane, ce qui est donc pas joli du tout. De plus, JScrollPane est plus grand que la table par conséquent quand je change la taille pour faire apparaitre une des barres de défilement, cette dernière va apparaitre loin de la table. Par exemple je vais avoir une fenetre très étiré horizontalement, mais très petite verticalement. Pour afficher toute les lignes, j'ai une barre de défilement qui doit apparaitre à droite. Mais cette barre n'est pas collée à la table et il y a donc un espace vide énorme entre la table et la limite du JScrollPane.

J'ai essayé de résoudre le problème en changeant le code :
JScrollPane scrollpane = new JScrollPane(table)
par
JScrollPane scrollpane = new JScrollPane()

puis de faire un seViewportView() au lieu d'un add, mais rien n'y fait, à l'écran c'est toujours la même chose.

Merci d'avance pour votre aide.

Voilà mon code :
Container mainPanel = this.getContentPane();
mainPanel.setLayout(new BorderLayout());
this.table.setModel(modele);
this.table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JPanel tablepanel = new JPanel();
tablepanel.add(table);
JScrollPane scrollpane = new JScrollPane();
scrollpane.setBorder(new EmptyBorder(5, 5, 5, 5));
scrollpane.setPreferredSize(table.getPreferredSize());
scrollpane.setViewportView(table);
mainPanel.add(scrollpane);
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(2, 1));
JButton bouton = new JButton("Changer valeur");
bouton.addActionListener(new BoutonChangement(this.table));
JPanel paneauSecondaire = new JPanel();
paneauSecondaire.setLayout(new FlowLayout());
paneauSecondaire.add(bouton);
panel.add(paneauSecondaire);
bouton = new JButton("Quitter");
bouton.addActionListener(new BoutonQuitter());
paneauSecondaire = new JPanel();
paneauSecondaire.setLayout(new FlowLayout());
paneauSecondaire.add(bouton);
panel.add(paneauSecondaire);
mainPanel.add(panel, BorderLayout.EAST);
this.setSize(500, 300);
this.setContentPane(mainPanel);
this.addWindowListener(new GestionFenetre());
this.pack();

3 réponses

JBAware Messages postés 174 Date d'inscription lundi 23 septembre 2002 Statut Membre Dernière intervention 6 avril 2011 1
19 avril 2004 à 11:57
8-) JB@WAre

essaie

this.table.setAutoResizeMode(JTable.AUTO_RESIZE_ON); de facon a ce que cela colle avec la taille de ton JScrollpane

et scrollpane.add(table);
0
cs_hadriel Messages postés 4 Date d'inscription jeudi 15 avril 2004 Statut Membre Dernière intervention 20 avril 2004
19 avril 2004 à 17:43
Ce champ static n'existe pas :(
Le truc c'est que je veux garder une taille de colonne fixe ... si je vire cette ligne, j'ai des colonnes de taille variables.

Par exemple quand tu fais une bataille navale, tu veux que tes colonnes soient de taille fixe, c'est la même idée ici.
0
cs_hadriel Messages postés 4 Date d'inscription jeudi 15 avril 2004 Statut Membre Dernière intervention 20 avril 2004
20 avril 2004 à 10:56
Bon en fait j'ai une solution à mon problème, je la poste au cas où ça puisse un jour intéresser des personnes.

donc pour avoir une JTable centrée dans un JScrollPane, il suffit de jouer des bordures :
scrollpane.setBorder(BorderFactory.createEmptyBorder(insets));
Le insets doit être calculé en fonction de la taille de la table :
Dimension tableDimension = table.getPreferredSize();
Dimension scrollpaneDimension = scrollpane.getSize();
int margeHeight = (scrollpaneDimension.height - tableDimension.height) / 2;
int margeWidth = (scrollpaneDimension.width - tableDimension.width) / 2;
if (margeHeight < 0) margeHeight = 0;
if (margeWidth < 0) margeWidth = 0;
Insets insets = new Insets(margeHeight, margeWidth, margeWidth, margeHeight);
0
Rejoignez-nous