JTable将不显示列标题


78

我有以下代码实例化一个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
...

}

与其他表格代码相比,我看不到任何遗漏的步骤,但是必须缺少某些内容。

Answers:


172

把你的JTable里面JScrollPane。试试这个:

add(new JScrollPane(scrTbl));

5
我之前已经发现(并使用过)此解决方案,但是我很好奇是否有人知道为什么这样可行。
乔·卡纳汉

17
它放到JScrollPane顶部组件(或顶视图或类似名称的表)中的表头在没有顶部组件的情况下,JTable显得没有头。这是设计使然。
OscarRyz

9
我发现这个链接,它可能会有所帮助understaning这个问题:blog.danieldee.com/2009/07/...
埃尔坎Haspulat

1
同样来自JTable类中“ configureEnclosingScrollPane”的Javadoc:如果此JTable是封闭的JScrollPane的viewportView(通常情况),请通过配置表的tableHeader作为滚动窗格的columnHeaderView来配置此ScrollPane。当使用新的JScrollPane(myTable)以常规方式将JTable添加到JScrollPane时,将在JTable中调用addNotify(将表添加到视口时).JTable的addNotify方法又调用此方法,该方法受到保护该默认安装过程可以被子类覆盖。
sateesh 2010年

1
列标题由一个单独的组件JTableHeader显示。如果将JTable放在JScrollPane内,它将自动将标题添加为JScrollPane的列标题。如果不将其放入JScrollPane中,则必须手动添加标头(使用BorderLayout可能是最好的方法)。
Abg 2012年

24

此答案与接受的答案之间的主要区别是使用setViewportView()代替add()

如何把JTableJScrollPane使用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,您应该提供更多说明为什么执行此操作。
飞机
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.