web-dev-qa-db-fra.com

Comment faire JTable à la fois Autosize et défilement horizontal?

Je mets une JTable dans un JScrollPane

Mais lorsque je définis JTable Auto Resizeable, il n'aura pas de barre de défilement horizontale.

si je mets AUTO_RESIZE_OFF, alors la Jtable ne remplira pas la largeur de son conteneur lorsque la largeur de colonne n'est pas assez grande.

Alors, comment puis-je faire cela:

  1. lorsque la table n'est pas assez large, développez pour remplir la largeur de son conteneur
  2. lorsque la table est suffisamment large, faites-la défiler.

Merci

25
Leon

Vous devez personnaliser le comportement de l'interface Scrollable.

import Java.awt.*;
import Java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableHorizontal extends JFrame
{
    public TableHorizontal()
    {
        final JTable table = new JTable(10, 5)
        {
            public boolean getScrollableTracksViewportWidth()
            {
                return getPreferredSize().width < getParent().getWidth();
            }
        };
        table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
        final JScrollPane scrollPane = new JScrollPane( table );
        getContentPane().add( scrollPane );
    }

    public static void main(String[] args)
    {
        TableHorizontal frame = new TableHorizontal();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setSize(400, 300);
        frame.setVisible(true);
    }
}

Le code ci-dessus dimensionne essentiellement le composant à sa taille préférée ou à la taille de la fenêtre d'affichage, la valeur la plus élevée étant retenue.

38
camickr

Si, pour une raison quelconque, la personnalisation de JTable n'est pas une option (par exemple, elle peut être créée dans un code tiers), vous pouvez obtenir le même résultat en la configurant pour basculer entre deux modes différents de JTable AUTO_RESIZE chaque fois que la fenêtre contenant est redimensionnée, par exemple:

jTable.getParent().addComponentListener(new ComponentAdapter() {
    @Override
    public void componentResized(final ComponentEvent e) {
        if (jTable.getPreferredSize().width < jTable.getParent().getWidth()) {
            jTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        } else {
            jTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        }
    }
});
9
gb96

J'ai trouvé que tout ce qui est nécessaire est d'inclure

  table = new JTable(model);
  // this enables horizontal scroll bar
  table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );    

puis lorsque la largeur et la hauteur de la fenêtre d'affichage requises ont été calculées, inclure

  frame.getContentPane().add(new JScrollPane(table))
  table.setPreferredScrollableViewportSize(new Dimension(width,height));
2
Nick Thomas

Si vous définissez la disposition de son conteneur sur BorderLayout avec une contrainte de disposition BorderLayout.CENTER , la JTable se redimensionnera automatiquement pour s'adapter à son conteneur.

Si vous voulez faire défiler un composant, vous pouvez envelopper la JTable avec un JScrollPane .

setLayout(new BorderLayout());
add(new JScrollPane(new JTable()), BorderLayout.CENTER);
0
Mohamed Mansour