JTable zeigt keine Spaltenüberschriften an

78

Ich habe den folgenden Code, um eine JTable zu instanziieren: Die Tabelle enthält die richtige Anzahl von Zeilen und Spalten, aber es gibt keine Anzeichen für die Titel auf den Spalten.

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
...

}

Wenn ich dies mit anderem Code zum Erstellen von Tabellen vergleiche, sehe ich keine fehlenden Schritte, aber etwas muss fehlen.

John R Doner
quelle

Antworten:

172

Steck dein JTableInneres ein JScrollPane. Versuche dies:

add(new JScrollPane(scrTbl));
Erkan Haspulat
quelle
5
Ich habe diese Lösung bereits entdeckt (und verwendet), bin aber gespannt, ob jemand weiß, warum dies funktioniert.
Joe Carnahan
17
Der Tabellenkopf, der in die JScrollPane-Topkomponente (oder die Draufsicht oder ähnliches) eingefügt wird. Wenn keine Topkomponente vorhanden ist, wird die JTable kopflos angezeigt. Dies ist beabsichtigt.
OscarRyz
9
Ich habe diesen Link gefunden, es könnte hilfreich sein, dieses Problem zu verstehen: blog.danieldee.com/2009/07/…
Erkan Haspulat
1
Ebenfalls aus Javadoc von "configureEnclosingScrollPane" in der JTable-Klasse: Wenn diese JTable die Ansichtsfensteransicht eines einschließenden JScrollPane ist (die übliche Situation), konfigurieren Sie dieses ScrollPane, indem Sie unter anderem den tableHeader der Tabelle als columnHeaderView des Bildlauffensters installieren. Wenn eine JTable auf die übliche Weise mit einem neuen JScrollPane (myTable) zu einem JScrollPane hinzugefügt wird, wird addNotify in der JTable aufgerufen (wenn die Tabelle zum Ansichtsfenster hinzugefügt wird). Die addNotify-Methode von JTable ruft diese Methode auf, die so geschützt ist dass diese Standardinstallationsprozedur von einer Unterklasse überschrieben werden kann.
Sateesh
1
Die Spaltenüberschriften werden von einer separaten Komponente, einem JTableHeader, angezeigt. Wenn die JTable in ein JScrollPane eingefügt wird, wird der Header automatisch als Spaltenheader des JScrollPane hinzugefügt. Wenn Sie es nicht in ein JScrollPane einfügen, müssen Sie den Header manuell hinzufügen (es ist wahrscheinlich am besten, ein BorderLayout zu verwenden).
Abb.
24

Der Hauptunterschied zwischen dieser Antwort und der akzeptierten Antwort ist die Verwendung von setViewportView()anstelle vonadd() .

So platzieren Sie JTablein JScrollPanemit Eclipse IDE:

  1. JScrollPaneContainer über die Registerkarte Design erstellen .
  2. Auf JScrollPanedie gewünschte Größe dehnen (gilt für das absolute Layout).
  3. Ziehen Sie die JTableKomponente JScrollPaneper Drag & Drop auf (Ansichtsfensterbereich).

In Struktur> Komponenten tablesollte ein Kind von sein scrollPane. Geben Sie hier die Bildbeschreibung ein

Der generierte Code wäre ungefähr so:

JScrollPane scrollPane = new JScrollPane();
...

JTable table = new JTable();
scrollPane.setViewportView(table);
Silber-
quelle
11

Wie in den vorherigen Antworten erwähnt, besteht der "normale" Weg darin, es einem JScrollPane hinzuzufügen, aber manchmal möchten Sie nicht, dass es einen Bildlauf durchführt (fragen Sie mich nicht wann :)). Dann können Sie den TableHeader selbst hinzufügen. So was:

JPanel tablePanel = new JPanel(new BorderLayout());
JTable table = new JTable();
tablePanel.add(table, BorderLayout.CENTER);
tablePanel.add(table.getTableHeader(), BorderLayout.NORTH);
Tobias Sjöbeck
quelle
Wenn Sie nicht möchten, dass ein Bildlauf durchgeführt wird, enthält Ihre Tabelle eine große Datenmenge sowohl vertikal als auch horizontal. Wenn Sie beliebig von der Position (0,0) wegblättern, hat der Endbenutzer keine Ahnung, in welcher Spalte er sich befindet starren auf ein Stück Daten.
Searchengine27
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);

   }

}}

Versuche dies!!

chaithra_a
quelle
1
getContentPane().add(table);macht hier keinen Sinn. Abgesehen davon: Diese Antwort fügt im Vergleich zu den vorhandenen Antworten nichts hinzu.
Marco13
@chaithra_a Sie sollten mehr Beschreibung geben, warum Sie dies tun.
Flugzeug