JTable no mostrará encabezados de columna


79

Tengo el siguiente código para crear una instancia de JTable: la tabla aparece con el número correcto de filas y columnas, pero no hay señales de los títulos encima de las columnas.

public Panel1()
{
    int  nmbrRows;

    setLayout(null);
    setBackground(Color.magenta);
    Vector colHdrs;

    //create column headers

    colHdrs = new Vector(10);
    colHdrs.addElement(new String("Ticker"));

    // more statements like the above to establish all col. titles       

    nmbrRows = 25;
    DefaultTableModel tblModel = new DefaultTableModel(nmbrRows, colHdrs.size());
    tblModel.setColumnIdentifiers(colHdrs);

    scrTbl = new JTable(tblModel);
    scrTbl.setBounds(25, 50, 950, 600);
    scrTbl.setBackground(Color.gray);
    scrTbl.setRowHeight(23);    
    add(scrTbl);

//rest of constructor
...

}

Al comparar esto con otro código de creación de tablas, no veo ningún paso que falte, pero algo debe estar ausente.

Respuestas:


174

Pon tu JTableinterior a JScrollPane. Prueba esto:

add(new JScrollPane(scrTbl));

5
Descubrí (y usé) esta solución antes, pero tengo curiosidad por saber si alguien sabe por qué funciona.
Joe Carnahan

17
El encabezado de la tabla que puso en el componente superior JScrollPane (o la vista superior o algo así se llama) Cuando no hay un componente superior, JTable aparece sin cabeza. Esto es por diseño.
OscarRyz

9
Encontré este enlace, podría ser útil comprender este problema: blog.danieldee.com/2009/07/…
Erkan Haspulat

1
También de Javadoc de "configureEnclosingScrollPane" en la clase JTable: Si este JTable es el viewportView de un JScrollPane adjunto (la situación habitual), configure este ScrollPane, entre otras cosas, instalando el tableHeader de la tabla como columnHeaderView del panel de desplazamiento. Cuando se agrega un JTable a un JScrollPane de la manera habitual, usando el nuevo JScrollPane (myTable), se llama a addNotify en el JTable (cuando la tabla se agrega a la ventana gráfica). El método addNotify de JTable a su vez llama a este método, que está protegido por lo que que este procedimiento de instalación predeterminado puede ser anulado por una subclase.
sateesh

1
Los encabezados de columna se muestran mediante un componente independiente, un JTableHeader. Si JTable se coloca dentro de un JScrollPane, agrega el encabezado automáticamente como encabezado de columna del JScrollPane. Si no lo coloca en un JScrollPane, debe agregar el encabezado a mano (probablemente sea mejor usar un BorderLayout).
abg

24

La principal diferencia entre esta respuesta y la respuesta aceptada es el uso de en setViewportView()lugar deadd() .

¿Cómo poner JTableen JScrollPaneel uso de Eclipse IDE:

  1. Cree un JScrollPanecontenedor a través de la pestaña Diseño.
  2. Estire JScrollPaneal tamaño deseado (se aplica al diseño absoluto).
  3. Arrastra y suelta el JTablecomponente encima deJScrollPane (Área de ventana gráfica).

En Estructura> Componentes, tabledebe ser hijo descrollPane . ingrese la descripción de la imagen aquí

El código generado sería algo como esto:

JScrollPane scrollPane = new JScrollPane();
...

JTable table = new JTable();
scrollPane.setViewportView(table);

11

Como se dijo en las respuestas anteriores, la forma 'normal' es agregarlo a un JScrollPane, pero a veces no desea que se desplace (no me pregunte cuándo :)). Luego, puede agregar el TableHeader usted mismo. Me gusta esto:

JPanel tablePanel = new JPanel(new BorderLayout());
JTable table = new JTable();
tablePanel.add(table, BorderLayout.CENTER);
tablePanel.add(table.getTableHeader(), BorderLayout.NORTH);

El momento en el que no desea que se desplace es cuando su tabla contiene una gran cantidad de datos tanto vertical como horizontalmente, donde el desplazamiento arbitrariamente desde la posición (0,0) dejará al usuario final sin idea de qué columna están mirando en busca de un dato.
motor

1
    public table2() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 485, 218);
    setTitle("jtable");
    getContentPane().setLayout(null);

    String data[][] = { { "Row1/1", "Row1/2", "Row1/3" },
            { "Row2/1", "Row2/2", "Row2/3" },
            { "Row3/1", "Row3/2", "Row3/3" },
            { "Row4/1", "Row4/2", "Row4/3" }, };

    String header[] = { "Column 1", "Column 2", "Column 3" };

    // Table
    JTable table = new JTable(data,header);


    // ScrollPane
    JScrollPane scrollPane = new JScrollPane(table);
    scrollPane.setBounds(36, 37, 407, 79);
    getContentPane().add(scrollPane);

   }

}

¡¡prueba esto!!


1
getContentPane().add(table);no tiene sentido aquí. Aparte de eso: esta respuesta no agrega nada en comparación con las respuestas existentes.
Marco13

@chaithra_a, debe proporcionar más descripción de por qué hace esto.
avión
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.