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.

John R. Doner
fuente

Respuestas:

174

Pon tu JTableinterior a JScrollPane. Prueba esto:

add(new JScrollPane(scrTbl));
Erkan Haspulat
fuente
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);
plata
fuente
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);
Tobias Sjöbeck
fuente
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!!

chaithra_a
fuente
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