Java Jtable列标题未显示



我的代码(逻辑上)都很好,唯一的问题是列标题不在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);
    }
}

这是问题。

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

请勿直接添加表。使用JScrollPane显示表标头。

f.add(new JScrollPane(table))

为什么您需要将表放入JScrollPane

来自@dan帖子:

将组件放入JScrollPane的构造函数中时,您提到的是要应用的滚动的视图。

在另一侧,使用添加方法,您只需将组件添加到容器中,例如将其添加到JPanel中。这样,您就不会指定要添加滚动条的组件。

编辑:来自Javadoc(由Trashgod在评论部分引用)

这是创建滚动窗格的典型代码 表的容器:

JScrollPane scrollPane = new JScrollPane(table);
table.setFillsViewportHeight(true); 

此片段中的两行执行以下操作: jscrollpane构造函数被调用,该论点是指 表对象。这将创建一个滚动窗格作为容器 桌子;该表将自动添加到容器中。 jtable.setfillsviewportheight被调用以设置 填充ViewPortheight属性。当此属性为真时,表 即使表不使用,也使用容器的整个高度 有足够的行使用整个垂直空间。这使它更容易 将表作为拖放目标。滚动窗格 自动将表标头放置在视口的顶部。这 当查看区域的顶部保持列名时 表数据滚动。

如果您使用的是没有滚动窗格的桌子,则必须获得 台式组件并将其放置。例如:

container.setLayout(new BorderLayout());
container.add(table.getTableHeader(), BorderLayout.PAGE_START);
container.add(table, BorderLayout.CENTER);

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

我的问题是我将JFrame布局设置为null (f.setLayout(null))。因此,当我删除并添加

f.add(new JScrollPane(table)). 

它有效。

相关内容

  • 没有找到相关文章

最新更新