2011-05-11 23 views
5

Estoy usando un JScrollPane para mostrar un JTable. Quiero que las columnas de la tabla tengan un tamaño mínimo, de modo que cuando se encoja la pantalla, aparezca el desplazamiento horizontal; pero también quiero que puedan expandirse cuando la pantalla se ensancha. Con el código actual, las columnas no pasan su valor mínimo, es solo que la ventana gráfica deja de mostrar toda la tabla y no activa la barra de desplazamiento horizontal. ¿Hay algún método para establecer en qué ancho debe aparecer la barra de desplazamiento?Barra horizontal en JScrollPane

He aquí una parte del código que tengo:

private void addTable(JTable table){ 
    initColumnSizes(table); 

    JPanel tablePanel = new JPanel(new BorderLayout()); 
    JScrollPane scrolled = new JScrollPane(table); 
    scrolled.getViewport().setMinimumSize(tableSize); 
    scrolled.setMinimumSize(tableSize); 
    scrolled.setPreferredSize(tableSize); 
    scrolled.setBorder(border); 

    tablePanel.add(scrolled, BorderLayout.CENTER); 
    //more stuff 
} 

Este es el código para el método initColumns, en caso de que lo necesite

private void initColumnSizes(JTable table) { 
    TableModel model = table.getModel(); 
    TableColumn column = null; 
    Component comp = null; 
    int headerWidth = 0; 
    int cellWidth = 0; 
    TableCellRenderer headerRenderer = 
     table.getTableHeader().getDefaultRenderer(); 

    for (int i = 0; i > table.getColumnCount(); i++) { 
     column = table.getColumnModel().getColumn(i); 
     comp = headerRenderer.getTableCellRendererComponent(
       table, column.getHeaderValue(), 
       false, false, 0, 0); 
     headerWidth = comp.getPreferredSize().width; 

     comp = table.getDefaultRenderer(model.getColumnClass(i)). 
     getTableCellRendererComponent(
       table, model.getValueAt(0, i), 
       false, false, 0, i); 
     cellWidth = comp.getPreferredSize().width; 


     column.setPreferredWidth(Math.max(headerWidth, cellWidth)); 
     column.setMinWidth(column.getPreferredWidth()); 
    } 
} 
+1

Para una mejor ayuda antes, publique un [SSCCE] (http://pscode.org/sscce.html). –

Respuesta

4

Sospecho que el algoritmo de diseño de tabla simplemente opta por violar la restricción de tamaño mínimo en la última columna cuando no tiene espacio suficiente para acomodar todas las columnas, y no aplica un ancho mínimo para la columna mínima anchos

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); hará que aparezca la barra de desplazamiento horizontal, pero luego la tabla no cambia de tamaño cuando se hace más grande. Pero tal vez podría usar un ComponentListener para activar y desactivar el modo de cambio de tamaño automático dependiendo del ancho de la tabla.

+0

Esto funcionó, gracias. – Sednus

1

SwingX' JXTable tiene un modo de cambio de tamaño adicional que pudiera hacer lo que quiera, aunque enganchado a la prefSize de las columnas:

  • si suma de prefSizes < viewport.width, columnas están dimensionados para llenar la ventana gráfica
  • si suma de prefSizes> viewport.width, barra de desplazamiento horizontal está mostrando

la propiedad para controlar el modo es horizontalScrollBarEnabled, es desactivada por defecto

Cuestiones relacionadas