Cómo hacer JTable tanto AutoResize y del horizontall desplazable?

Estoy poniendo un JTable en un JScrollPane

Pero Cuando me puse JTable Auto Redimensionables, entonces no tiene barra de desplazamiento horizontal.

si me puse AUTO_RESIZE_OFF, entonces el Jtable no llenar el ancho de su contenedor cuando el ancho de la columna no es lo suficientemente grande.

Entonces, ¿cómo puedo hacer esto:

  1. cuando la tabla no es lo suficientemente amplio, se expanden para llenar su recipiente ancho
  2. cuando la tabla es lo suficientemente amplia, hacen que sea desplazable.

Gracias

InformationsquelleAutor Leon | 2011-05-24

4 Kommentare

  1. 38

    Usted necesita para personalizar el comportamiento de la Desplazable de la interfaz.

    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, los tamaños de los componentes en su tamaño preferido o el tamaño de la ventana, lo que sea mayor.

    • excelente conocimiento +1, para setSize -1
    • excelente! esto es exactamente lo que quiero.
    • Gracias por la solución. Funciona. !!!
    • +1 – Exactamente lo que yo estaba buscando.
    • ahhh … Fila, su truco – debe haber adivinado mucho 🙂 Pero es incompleta, dificulta el cambio de tamaño de columnas, consulte stackoverflow.com/q/15499255/203657
    • Yo aprender como responder a más preguntas (y ver otras respuestas). Consulte stackoverflow.com/questions/15234691/… para una aproximación actualizada.
    • Gran solución. Lo que realmente me ayudó a salir después de buscar por mucho tiempo…
    • ¿Por qué no actualizar esta respuesta con lo que has aprendido, entonces?

  2. 9

    Si por alguna razón la personalización de JTable no es una opción (por ejemplo, podría ser creado en el código de terceros), se puede obtener el mismo resultado mediante el establecimiento de alternar entre dos diferentes JTable AUTO_RESIZE modos, siempre que el contenido de la ventanilla se cambia el tamaño, 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);
            }
        }
    });
    • Trabajó como un encanto! Gracias por la solución más simple.
  3. 2

    He encontrado que todo lo que se necesita es incluir

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

    y, a continuación, cuando se requiere una área de visualización ancho y la altura han sido calculadas, incluyen

      frame.getContentPane().add(new JScrollPane(table))
      table.setPreferredScrollableViewportSize(new Dimension(width,height));
  4. 0

    Si se establece el Diseño de su envase para BorderLayout con un BorderLayout.CENTRO de diseño de restricción, entonces el JTable se auto de tamaño para adaptarse a su contenedor.

    Si quieres hacer una componente de desplazamiento, se puede envolver el JTable con un JScrollPane.

    setLayout(new BorderLayout());
    add(new JScrollPane(new JTable()), BorderLayout.CENTER);
    • Esto sólo auto cambia el tamaño de la anchura altura. ¿Cómo puedo hacer cambio de tamaño automático de la altura?

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea