Java JTable列标题未显示

Mat*_*sar 4 java swing jtable jscrollpane jtableheader

嗨伙计们希望你能帮到我这里,我的代码(逻辑方面)很好唯一的问题是列标题没有显示在2个表格中(表格和表格,一个用于教师,一个用于学生详细信息) )我怎么让它们显示?

        import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;


public class Display
{
    ArrayList<Student> stud1 = new ArrayList<Student>();
    ArrayList<SubjectTeacher> sTeach1 = new ArrayList<SubjectTeacher>();

    //For Display Teachers
    private  JTable table;
    private  JFrame f;
    private int i;

    //For DisplayStudents
    private JTable tableS;
    private JFrame fS;
    private int iS;


    //Displays Teachers
    public void displayTeachers()
    {

            f = new JFrame("Teachers");

            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(500,400);
            f.setVisible(true);



        String[] columnNames =  {"Name", "Surname", "ID", "Pay", "Subject"};

        sTeach1 = Stores.getTeach();
        i = sTeach1.size();


        Object[][] data = new Object[i+1][5];



            for (int j = 0; j<sTeach1.size(); j++)
            {
                {
                    SubjectTeacher myTeach = sTeach1.get(j);
                     data[j][0] = myTeach.getName();
                     data[j][1] = myTeach.getSurname();
                     data[j][2] = myTeach.getID();
                     data[j][3] = myTeach.getPay();
                     data[j][4] = myTeach.getSubjectID();
                };
            }




    JTable table = new JTable (data, columnNames);
    f.add(table);

    }



    //Displays Students
    public void displayStudents()
    {

        System.out.println(stud1.size());

            fS = new JFrame("Students");

            fS.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            fS.setSize(700,600);
            fS.setVisible(true);



        String[] colNames =  {"Name", "Surname", "ID", "Computer", "Physics", "Maths", "Tests", "Passes", "Fails"};


        stud1 = Stores.getStud();
        iS = stud1.size();

        Object[][] info = new Object[iS+1][9];




        for (int j = 0; j<stud1.size(); j++)
            {
                {


                    Student myStud = stud1.get(j);

                 info[j][0] = myStud.getName();
                 info[j][1] = myStud.getSurname();
                 info[j][2] = myStud.getID();
                 info[j][3] = myStud.getSubject(1);
                 info[j][4] = myStud.getSubject(2);
                 info[j][5] = myStud.getSubject(3);
                 info[j][6] = myStud.getTestsTaken();
                 info[j][7] = myStud.getPasses();
                 info[j][8] = myStud.getFails();
                };
            }




    JTable tableS = new JTable (info, colNames);
    fS.add(tableS);

    }

}
Run Code Online (Sandbox Code Playgroud)

Ama*_*ath 18

这是问题所在.

JTable table = new JTable (data, columnNames);
f.add(table);
Run Code Online (Sandbox Code Playgroud)

不要直接添加表.使用JScrollPane以显示表头.

f.add(new JScrollPane(table))
Run Code Online (Sandbox Code Playgroud)

你为什么要把桌子放在JScrollPane

来自@Dan帖子:

当您将组件放在a的构造函数中时JScrollPane,您提到要应用滚动的视图.

另一方面,使用add方法,只需将一个组件添加到容器中,就像将其添加到容器中一样JPanel.这样,您不需要指定要添加滚动条的组件.

编辑: 来自javadoc(在评论部分由trashgod引用)

以下是创建用作表的容器的滚动窗格的典型代码:

JScrollPane scrollPane = new JScrollPane(table);
table.setFillsViewportHeight(true); 
Run Code Online (Sandbox Code Playgroud)

此代码段中的两行执行以下操作:使用引用表对象的参数调用JScrollPane构造函数.这会创建一个滚动窗格作为表的容器; 该表自动添加到容器中.调用JTable.setFillsViewportHeight来设置fillsViewportHeight属性.当此属性为true时,表使用容器的整个高度,即使表没有足够的行来使用整个垂直空间.这样可以更轻松地将表用作拖放目标.滚动窗格自动将表头放置在视口的顶部.滚动表数据时,列名称在查看区域的顶部仍然可见.

如果您使用的是没有滚动窗格的表,则必须获取表头组件并自行放置.例如:

container.setLayout(new BorderLayout());
container.add(table.getTableHeader(), BorderLayout.PAGE_START);
container.add(table, BorderLayout.CENTER);
Run Code Online (Sandbox Code Playgroud)

  • 另请参阅[*将表添加到容器*](http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#show). (2认同)

Jer*_*vel 4

如果我没记错的话,你应该在它周围放一个容器(例如 a JScrollPane)。