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:
Merci
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.
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);
}
}
});
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));
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);