5

私のコード (Logic-wise) はすべて問題ありません。唯一の問題は、列ヘッダーが 2 つのテーブル (table と tableS、1 つは教師用、もう 1 つは生徒の詳細用) に表示されないことです。それらを表示するにはどうすればよいですか?

        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);

    }

}
4

3 に答える 3

21

これが問題です。

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

テーブルを直接追加しないでください。JScrollPaneテーブル ヘッダーを表示するために使用します。

f.add(new JScrollPane(table))

なぜテーブルを に入れる必要があるのJScrollPaneですか?

@ダンの投稿から:

コンポーネントを a のコンストラクター内に配置する場合JScrollPane、スクロールを適用するビューを指定します。

一方、 add メソッドを使用すると、コンポーネントをJPanel. この方法では、スクロール バーを追加するコンポーネントを指定しません。

EDIT:javadoc から(コメントセクションのtrashgodによって引用されています)

テーブルのコンテナーとして機能するスクロール ペインを作成するための一般的なコードを次に示します。

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

このスニペットの 2 行は、次のことを行います。 JScrollPane コンストラクターは、テーブル オブジェクトを参照する引数で呼び出されます。これにより、テーブルのコンテナとしてスクロール ペインが作成されます。テーブルはコンテナに自動的に追加されます。JTable.setFillsViewportHeight が呼び出されて、fillsViewportHeight プロパティが設定されます。このプロパティが true の場合、テーブルに垂直スペース全体を使用するのに十分な行がない場合でも、テーブルはコンテナーの高さ全体を使用します。これにより、テーブルをドラッグ アンド ドロップ ターゲットとして使用しやすくなります。スクロール ペインは、テーブル ヘッダーをビューポートの上部に自動的に配置します。テーブル データをスクロールしても、表示領域の上部に列名が表示されたままになります。

スクロール ペインのないテーブルを使用している場合は、テーブル ヘッダー コンポーネントを取得して配置する必要があります。例えば:

container.setLayout(new BorderLayout());
container.add(table.getTableHeader(), BorderLayout.PAGE_START);
container.add(table, BorderLayout.CENTER);
于 2012-12-18T16:05:50.813 に答える
4

JScrollPane私の記憶が正しければ、その周りにコンテナ(例:)を置く必要があります。

于 2012-12-18T15:22:37.310 に答える