2011-05-24 16 views
21

Estoy colocando una JTable en un JScrollPane¿Cómo hacer que JTable sea tanto AutoResize como horizontall scrollable?

Pero cuando establezco JTable Auto Resizeable, entonces no tendrá barra de desplazamiento horizontal.

si configuro AUTO_RESIZE_OFF, entonces el Jtable no llenará el ancho de su contenedor cuando el ancho de la columna no sea lo suficientemente grande.

Entonces, ¿cómo puedo hacer esto:

  1. cuando la mesa no es lo suficientemente ancha, expandirse para llenar su anchura contenedor
  2. cuando la tabla es lo suficientemente amplia, que sea desplazable.

Gracias

Respuesta

33

Debe personalizar el comportamiento de la interfaz desplazable.

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); 
    } 
} 

El código anterior básicamente dimensiona el componente en su tamaño preferido o el tamaño de la ventana gráfica, el que sea mayor.

+1

excelente conocimiento +1, para setSize -1 – mKorbel

+0

¡excelente! esto es exactamente lo que quiero – Leon

+0

Gracias por la solución. Funciona. !!! –

0

Si se establece el diseño de su envase para BorderLayout con una restricción BorderLayout.CENTER diseño, entonces el JTable será de tamaño automático para adaptarse a su contenedor.

Si desea hacer un componente desplazable, puede envolver la JTable con un JScrollPane.

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

Esto solo cambia automáticamente el ancho y no el alto. ¿Cómo puedo hacer que cambie automáticamente el tamaño de la altura? – bbodenmiller

7

Si por alguna razón personalizar JTable no es una opción (por ejemplo, podría crearse en un código de terceros), puede lograr el mismo resultado configurándolo para alternar entre dos modos diferentes de JTable AUTO_RESIZE cada vez que se cambie el tamaño de la ventana gráfica , por ejemplo:

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); 
     } 
    } 
}); 
+0

¡Funcionó como un amuleto! Gracias por la solución simple. – Vova

1

encontré que todo lo que se necesita es incluir

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

y luego, cuando se han calculado el ancho de la ventana gráfica requerido y la altura, incluyen

frame.getContentPane().add(new JScrollPane(table)) 
    table.setPreferredScrollableViewportSize(new Dimension(width,height)); 
Cuestiones relacionadas