JTable не відображатиме заголовки стовпців


79

У мене є такий код для створення екземпляра JTable: у таблиці з’являється потрібна кількість рядків і стовпців, але на колонках немає заголовків.

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

}

Порівнюючи це з іншим кодом для створення таблиць, я не бачу відсутніх кроків, але щось повинно бути відсутнім.

Відповіді:


174

Покладіть JTableвсередину a JScrollPane. Спробуйте це:

add(new JScrollPane(scrTbl));

5
Я вже раніше відкривав (і використовував) це рішення, але мені цікаво, якщо хтось знає, чому це працює.
Джо Карнахан

17
Заголовок таблиці, який він помістив у верхній компонент JScrollPane (або вид зверху або щось подібне, що називається) Коли верхнього компонента немає, JTable виглядає безголовим. Це за задумом.
OscarRyz

9
Я знайшов це посилання, може бути корисним для розуміння цієї проблеми: blog.danieldee.com/2009/07/…
Еркан Хаспулат

1
Також з Javadoc з "configureEnclosingScrollPane" у класі JTable: Якщо ця JTable є viewportView вкладеного JScrollPane (звичайна ситуація), налаштуйте цей ScrollPane, серед іншого, встановивши tableHeader таблиці як панель columnHeaderView області прокрутки. Коли JTable додається до JScrollPane звичайним способом, використовуючи новий JScrollPane (myTable), addNotify викликається в JTable (коли таблиця додається до області перегляду). Метод addNotify JTable у свою чергу викликає цей метод, який захищений таким чином що цю процедуру встановлення за замовчуванням можна замінити підкласом.
sateesh

1
Заголовки стовпців відображаються окремим компонентом, JTableHeader. Якщо JTable поміщений всередину JScrollPane, він автоматично додає заголовок як заголовок стовпця JScrollPane. Якщо ви не поміщаєте його в JScrollPane, вам доведеться додати заголовок вручну (мабуть, найкраще використовувати BorderLayout).
приблизно

24

Основна відмінність цієї відповіді від прийнятої відповіді полягає у використанні setViewportView()замістьadd() .

Як покласти JTableв JScrollPaneвикористанні Eclipse IDE:

  1. Створити JScrollPaneконтейнер на вкладці Дизайн.
  2. Розтягніть JScrollPaneдо бажаного розміру (стосується Абсолютного макета).
  3. Перетягнути і кинути JTable компонент поверх JScrollPane(область перегляду).

У структурі> Компоненти, table має бути дочірнім елементом scrollPane. введіть тут опис зображення

Створений код буде приблизно таким:

JScrollPane scrollPane = new JScrollPane();
...

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

11

Як було сказано в попередніх відповідях, "звичайним" способом є додавання його до JScrollPane, але іноді ви не хочете, щоб він прокручувався (не питайте мене, коли :)). Тоді ви можете додати TableHeader самостійно. Подобається це:

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

Час, коли ви не хочете, щоб вона прокручувалась, коли ваша таблиця містить велику кількість даних як по вертикалі, так і по горизонталі, де довільне прокручування від положення (0,0) залишить кінцевому користувачеві незрозумілість щодо того, який стовпець він дивляться на шматок даних.
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);

   }

}

спробуйте це!!


1
getContentPane().add(table);тут не має сенсу. Крім цього: Ця відповідь не додає нічого порівняно з існуючими відповідями.
Marco13

@chaithra_a ви повинні надати більше опису, чому ви це робите.
літак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.