2010-10-04 6 views
2

J'ai suivi quelques conseils dans ce guide: JTable with horizontal scrollbar mais j'ai toujours des problèmes.Java Swing; Problèmes avec le défilement horizontal pour un JTable intégré dans un JScrolledPane

J'ai deux têtes de colonne: nom et la description (. Pour nous en l'ex)

Je veux être en mesure de faire défiler horizontalement chaque fois qu'une entrée est ajoutée (par exemple: Nom/Description est juste 1 ligne) . Cependant, Swing ne semble pas par défaut à ce comportement!

J'ai une JTable intégrée dans un ScrollPane. JScrollPane a les paramètres suivants: JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED et JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED

Si je désactive avec: myTable.AutoResizeMode(AUTO_RESIZE_OFF) les en-têtes de colonne ne remplissent pas toute la table (peut-être juste 1/2 de la table). Je dois redimensionner manuellement la colonne "Description" pour voir le tout.

Comment puis-je avoir une autoresizing, mais le défilement horizontal fonctionne toujours?

Répondre

2

Vous pouvez étendre JTable comme suit:

public class JHorizontalFriendlyTable extends JTable { 

    @Override 
    public Dimension getPreferredSize() { 
    if (getParent() instanceof JViewport) { 
     if (
     ((JViewport) getParent()).getWidth() > super.getPreferredSize().width) 
    ) { 
     return getMinimumSize(); 
     } 
    } 
    return super.getPreferredSize(); 
    } 

    @Override 
    public boolean getScrollableTracksViewportWidth() { 
    if (autoResizeMode != AUTO_RESIZE_OFF) { 
     if (getParent() instanceof JViewport) { 
     return (((JViewport) getParent()).getWidth() > getPreferredSize().width); 
     } 
     return true; 
    } 
    return false; 
    } 
} 
utilisation

exemple:

jScrollPane1 = new JScrollPane(); 
TableModel jTable1Model = new DefaultTableModel(...); 
JTable jTable1 = new JHorizontalFriendlyTable(); 
jScrollPane1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); 
jScrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); 
jScrollPane1.setViewPortView(jTable1); 
jTable1.setModel(jTable1Model); 
jTable1.setPreferredSize(new java.awt.Dimension(1051,518)); 
jTable1.setPreferredScrollableViewPortSize(new java.awt.Dimension(1000,528)); 
jTable1.getSize(new java.awt.Dimension(1051, 528)); 

if (jTable1.getPreferredScrollableViewPortSize().getWidth() > 
    ((JViewPort) jTable1.getParent()).getPreferredSize().getWidth()) 
    { 
    jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 
    jTable1.doLayout(); 
} 

jTable1.setDragEnabled(false); 
jTable1.setColumnSelectionAllowed(false); 
jTable1.getTableHeader().setReorderingAllowed(false); 
1

Le redimensionnement automatique signifie le redimensionnement automatique pour éviter le défilement.

Donc la réponse est non avec la norme JTable.

Vérifiez JXTable et voir si elle fait ce que vous voulez (je ne l'ai pas utilisé moi-même).

2

Une approche peut être d'utiliser setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS) lorsque vous créez la table, puis d'utiliser setPreferredScrollableViewportSize() pour spécifier la taille souhaitée. Après la fenêtre, utilisez setAutoResizeMode(JTable.AUTO_RESIZE_OFF) pour autoriser le défilement horizontal.

1

Si je désactive avec: myTable.AutoResizeMode (AUTO_RESIZE_OFF) les en-têtes de colonne ne remplissent pas la table entière (peut-être juste 1/2 de la table ).

Par défaut, chaque colonne n'a qu'une largeur de 75 pixels. Vous pouvez changer la largeur de la colonne de description pour être ce que vous voulez. Lire l'API JTable et vous trouverez un lien vers le tutoriel Swing sur "Comment utiliser les tableaux" qui explique comment faire cela. Cependant, même en utilisant cette approche, la taille de la colonne ne changera pas si l'utilisateur redimensionne la trame. Si vous voulez gérer cette situation, vous devez ajouter un ComponentListener à la table (ou peut-être le volet de défilement). Ensuite, à chaque fois que la méthode componentResized() est déclenchée, vous pouvez totaliser les largeurs des deux colonnes, puis ajuster la largeur de la colonne de description si nécessaire pour vous assurer que la largeur totale de la colonne n'est pas inférieure à la largeur de la table.

je dois redimensionner manuellement le « Description » colonne pour voir toute chose .

Si vous savez que votre colonne de description sera toujours assez grand pour remplir la fenêtre du scrollpane alors vous pouvez utiliser le Table Column Adjuster pour calculer automatiquement la largeur maximale de la colonne de description

+0

+1 Ceci est un gène plus solution globale que la réponse acceptée. – trashgod

Questions connexes