代码之家  ›  专栏  ›  技术社区  ›  rawsly

如何将JTable添加到JTabbedPane?

  •  0
  • rawsly  · 技术社区  · 7 年前

    我正在编写一个GUI,它显示800个学生的表格,其中学生的信息是从txt文件中读取的。我编写了一个Screen()类和StudentTable()类,其中Screen类有两个JPanel选项卡“PList”和“PChart”的TabbedPane。我想将StudentTable类添加到PList JPanel中。所以当我运行Screen类时,它将显示StudentTable类,其中包含StudentTable。通常情况下,我会在没有标签的情况下显示我的表。 首先,我打开了“Students.txt”文件,然后我阅读了文件。然后我关闭了文件。之后,我创建了一个void方法createTable(),用于创建表。该表从ArrayList获取信息。现在,我想把这个类添加到我的PList JPanel中。代码有点长。所以我上传了。但是,如果你想让我分享代码,我也可以。
    屏幕Java语言

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JTabbedPane;
    
    public class Screen extends JFrame implements ActionListener {
        private JTabbedPane tabbedPane;
        private JPanel PList, PChart;
        private JMenuBar menuBar;
        private JMenu menuStudent, menuSort, menuFilter;
        private JMenuItem addStudent, removeStudent, removeAllStudents;
        private JMenuItem sortLastName, sortId, sortAverage;
        private JMenuItem filterLetterGrade, removeFilter;
    
        private StudentTable studentTable;
    
        public Screen() {
            // TODO Auto-generated constructor stub
            tabbedPane = new JTabbedPane();
            menuBar = new JMenuBar();
            menuStudent = new JMenu();
            menuSort = new JMenu();
            menuFilter = new JMenu();
            addStudent = new JMenuItem();
            removeStudent = new JMenuItem();
            removeAllStudents = new JMenuItem();
            sortLastName = new JMenuItem();
            sortId = new JMenuItem();
            sortAverage = new JMenuItem();
            filterLetterGrade = new JMenuItem();
            removeFilter = new JMenuItem();     
            PList = new JPanel();
            PChart = new JPanel();
    
            studentTable = new StudentTable();
    
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setVisible(true);
            setExtendedState(MAXIMIZED_BOTH);
            setTitle("Screen");
            setLayout(new BorderLayout());
            setJMenuBar(menuBar);
    
            // Menu
            menuStudent.setText("Student");
            addStudent.setText("Add Student");
            addStudent.addActionListener(this);
            removeStudent.setText("Remove Student");
            removeStudent.addActionListener(this);
            removeAllStudents.setText("Remove All Students");
            removeAllStudents.addActionListener(this);
            menuStudent.add(addStudent);
            menuStudent.add(removeStudent);
            menuStudent.add(removeAllStudents);
    
            menuSort.setText("Sort");
            sortLastName.setText("Sort by last name");
            sortLastName.addActionListener(this);
            sortId.setText("Sort by ID");
            sortId.addActionListener(this);
            sortAverage.setText("Sort by average");
            sortAverage.addActionListener(this);
            menuSort.add(sortLastName);
            menuSort.add(sortId);
            menuSort.add(sortAverage);
    
            menuFilter.setText("Filter");
            filterLetterGrade.setText("Filter by letter grade");
            filterLetterGrade.addActionListener(this);
            removeFilter.setText("Remove filter");
            removeFilter.addActionListener(this);
            menuFilter.add(filterLetterGrade);
            menuFilter.add(removeFilter);
    
            menuBar.add(menuStudent);
            menuBar.add(menuSort);
            menuBar.add(menuFilter);
    
            // Tabs
            tabbedPane.add("List", PList);
            tabbedPane.add("Chart", PChart);
            add(tabbedPane);
            PList.add(studentTable);
    
        }
    
        public static void main(String[] args) {
            new Screen();
    
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
    
        }
    }
    

    学生桌。Java语言

    import java.net.URL;
    import java.util.ArrayList;
    import java.util.Scanner;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    
    public class StudentTable extends JPanel {
    
        private static JTable table;
        private String name, lastName, letterGrade;
        private long studentId;
        private double quiz1,quiz2,project,midterm,finalGrade,average;
        private static ArrayList<Students> studentList;
        private Scanner scanner;
    
        public StudentTable() {
        }
    
        /**
         * 
         * @param name
         * @param lastName
         * @param studentId
         * @param quiz1
         * @param quiz2
         * @param project
         * @param midterm
         * @param finalGrade
         * @param average
         * @param letterGrade
         */
        public StudentTable(String name, String lastName, long studentId, double quiz1, double quiz2, double project, double midterm, double finalGrade, double average, String letterGrade) {
            this.name = name;
            this.lastName = lastName;
            this.letterGrade = letterGrade;
            this.studentId = studentId;
            this.quiz1 = quiz1;
            this.quiz2 = quiz2;
            this.project = project;
            this.midterm = midterm;
            this.finalGrade = finalGrade;
            this.average = average;
        }
    
        // GET & SET METHODS
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getLastName() {
            return lastName;
        }
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
        public String getLetterGrade() {
            return letterGrade;
        }
        public void setLetterGrade(String letterGrade) {
            this.letterGrade = letterGrade;
        }
        public long getStudentId() {
            return studentId;
        }
        public void setStudentId(long studentId) {
            this.studentId = studentId;
        }
        public double getQuiz1() {
            return quiz1;
        }
        public void setQuiz1(double quiz1) {
            this.quiz1 = quiz1;
        }
        public double getQuiz2() {
            return quiz2;
        }
        public void setQuiz2(double quiz2) {
            this.quiz2 = quiz2;
        }
        public double getProject() {
            return project;
        }
        public void setProject(double project) {
            this.project = project;
        }
        public double getMidterm() {
            return midterm;
        }
        public void setMidterm(double midterm) {
            this.midterm = midterm;
        }
        public double getFinalGrade() {
            return finalGrade;
        }
        public void setFinalGrade(double finalGrade) {
            this.finalGrade = finalGrade;
        }
        public double getAverage() {
            return average;
        }
        public void setAverage(double average) {
            this.average = average;
        }
        public ArrayList<Students> getStudentList() {
            return studentList;
        }
        public void setStudentList(ArrayList<Students> studentList) {
            this.studentList = studentList;
        }
    
        // Opening "Students.txt" file from a url.
        public void openFile() {
            try {
                URL url = new URL("http://rawsly.com/Students.txt");
                scanner = new Scanner(url.openStream());
            } catch (Exception e) {
                // TODO: handle exception
                System.out.println("Error: " + e.getMessage());
            }
        }
    
        // Reading "Students.txt" file and adding students to the "studentList" ArrayList.
        public void readFile() {
            studentList = new ArrayList<>();
            while(scanner.hasNext()) {
                name = scanner.next();
                lastName = scanner.next();
                studentId = scanner.nextLong();
                quiz1 = scanner.nextDouble();
                quiz2 = scanner.nextDouble();
                project = scanner.nextDouble();
                midterm = scanner.nextDouble();
                finalGrade = scanner.nextDouble();
                average = scanner.nextDouble();
                letterGrade = scanner.next();
                studentList.add(new Students(name, lastName, studentId, quiz1, quiz2, project, midterm, finalGrade, average, letterGrade));
            }
        }
    
        // Closing "Students.txt" file.
        public void closeFile() {
            scanner.close();
        }
    
        public void createTable() {
            openFile();
            readFile();
            closeFile();
            String [] columnNames = {"NAME", "SURNAME", "ID", "QUIZ1", "QUIZ2", "PROJECT", "MIDTERM", "FINAL", "AVERAGE", "LETTER GRADE"};
            Object [][] data = new Object[studentList.size()][10];
            for(int i=0; i<studentList.size(); i++) {
                for(int j=0; j<10; j++) {
                    switch (j) {
                    case 0:
                        data[i][0] = studentList.get(i).getName();
                        break;
                    case 1:
                        data[i][1] = studentList.get(i).getLastName();
                        break;
                    case 2:
                        data[i][2] = studentList.get(i).getStudentId();
                        break;
                    case 3:
                        data[i][3] = studentList.get(i).getQuiz1();
                        break;
                    case 4:
                        data[i][4] = studentList.get(i).getQuiz2();
                        break;
                    case 5:
                        data[i][5] = studentList.get(i).getProject();
                        break;
                    case 6:
                        data[i][6] = studentList.get(i).getMidterm();
                        break;
                    case 7:
                        data[i][7] = studentList.get(i).getFinalGrade();
                        break;
                    case 8:
                        data[i][8] = studentList.get(i).getAverage();
                        break;
                    case 9:
                        data[i][9] = studentList.get(i).getLetterGrade();
                        break;
                    } // end of the switch
                } // end of the first for loop
            } // end of the second for loop
    
            table = new JTable(data,columnNames) {
                public boolean isCellEditable(int row, int column) { // To make row and columns not editable
                    return false;
                }
            };
            table.setFillsViewportHeight(true);
            table.setAutoCreateRowSorter(true); // to activate sorting property of each column
        }
    
        public static void main(String[] args) {
            StudentTable s = new StudentTable();
            s.createTable();
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Touniouk    7 年前

    这就是如何在screen类中创建带有表的面板。

    studentTable = new StudentTable();
    

    这就是StudentTable的构造函数的样子。

    public StudentTable() {}
    

    你看到问题了吗?您正在调用一个空构造函数。

    您可以尝试通过在表构造函数中实际创建表或显式调用来修复它 createTable()

    所以要么在 Screen

    // Tabs
    tabbedPane.add("List", PList);
    tabbedPane.add("Chart", PChart);
    add(tabbedPane);
    studentTable.createTable(); // Create the table
    PList.add(studentTable);
    validate(); // Revalidate the frame
    

    或在中创建表 StudentTable

    public StudentTable() {
        createTable();
    }
    

    看,就这么简单。现在可以用了吗?不是真的。StudentTable是一个 Panel 实际上,你从来没有添加任何内容。因此,您只需在选项卡窗格中添加一个空面板。

    您需要在某个时候将表实际添加到面板中。所以回到 学生桌 类和添加 add(table) createTable() 方法或者,如果要在构造函数中调用createTable(),也可以在构造函数的createTable()下面添加这一行。

    public StudentTable() {
        createTable();
        add(table);
    }
    

    你现在能看到桌子吗?是的,你可以。你能看到表中的所有值吗?不,你不能。这是因为表格不可滚动。您需要将其添加到 ScrollPane .

    最简单的方法是创建一个 学生桌 Table 然后添加 滚动窗格 面板

    回到你曾经写过的地方 学生桌 类别和 代替 具有

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

    这应该可以暂时解决您的问题。

    另外,我想指出,您使用了太多的类字段。例如 学生桌 name , lastName , letterGrade , studentId , quiz1 , quiz2 , project , midterm , finalGrade , average scanner 作为一个领域是没有用的。除了一个之外,所有属性都不是表的属性,它们不代表表的实例。它们代表一个 Student 我建议你看看 this answer 一个相关的问题。

    永远不要使用字段来简化从一个方法到另一个方法的数据传递。这根本不是它的目的。这样做也会使方法本身不安全或需要同步。

    您也不需要 main() 方法。当它启动时,它只是作为代码的入口点,就是这样。

    关于getter和setter,只添加您需要的。你的 screen 类不访问 学生桌 类(可以理解,因为它们中的大多数都是不合理的,对其他类来说完全没有用),但是它们中的每一个都有一个getter和setter。 如果你有很多getter和setter,把它们放在最后,这就不需要滚动20分钟来访问类中的任何实际实现。

    学生桌

    import java.io.IOException;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.Scanner;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    
    public class StudentTablePanel extends JPanel {
    
        private static JTable table;
    
        public StudentTablePanel() {
            table = createTable(getStudentList()); // This line—in my opinion—makes it more immediately understandable what is happening, you're creating a table from a list of students.
            JScrollPane scrollPane = new JScrollPane(table);
            table.setFillsViewportHeight(true);
            add(scrollPane);
        }
    
        // Reading "Students.txt" file and adding students to the "studentList" ArrayList.
        public ArrayList<Students> getStudentList() {
            ArrayList<Students> list = new ArrayList<>();
            try (Scanner scanner = new Scanner(new URL("http://rawsly.com/Students.txt").openStream())) { // Try with resources loop automatically closes the scanner when done
                while (scanner.hasNext()) {
                    String name = scanner.next();
                    String lastName = scanner.next();
                    long studentId = scanner.nextLong();
                    double quiz1 = scanner.nextDouble();
                    double quiz2 = scanner.nextDouble();
                    double project = scanner.nextDouble();
                    double midterm = scanner.nextDouble();
                    double finalGrade = scanner.nextDouble();
                    double average = scanner.nextDouble();
                    String letterGrade = scanner.next();
                    list.add(new Students(name, lastName, studentId, quiz1, quiz2, project, midterm, finalGrade, average, letterGrade));
                }
            } catch (IOException ex) {
                // Handle your exception
            }
            return list;
        }
    
        public JTable createTable(ArrayList<Students> studentList) {
            String[] columnNames = {"NAME", "SURNAME", "ID", "QUIZ1", "QUIZ2", "PROJECT", "MIDTERM", "FINAL", "AVERAGE", "LETTER GRADE"};
            int row = studentList.size();
            int column = columnNames.length;
            Object[][] data = new Object[row][column];
            for (int i = 0; i < row; i++) {
                for (int j = 0; j < column; j++) {
                    switch (j) {
                        case 0:
                            data[i][0] = studentList.get(i).getName();
                            break;
                        case 1:
                            data[i][1] = studentList.get(i).getLastName();
                            break;
                        case 2:
                            data[i][2] = studentList.get(i).getStudentId();
                            break;
                        case 3:
                            data[i][3] = studentList.get(i).getQuiz1();
                            break;
                        case 4:
                            data[i][4] = studentList.get(i).getQuiz2();
                            break;
                        case 5:
                            data[i][5] = studentList.get(i).getProject();
                            break;
                        case 6:
                            data[i][6] = studentList.get(i).getMidterm();
                            break;
                        case 7:
                            data[i][7] = studentList.get(i).getFinalGrade();
                            break;
                        case 8:
                            data[i][8] = studentList.get(i).getAverage();
                            break;
                        case 9:
                            data[i][9] = studentList.get(i).getLetterGrade();
                    } // end of the switch
                } // end of the first for loop
            } // end of the second for loop
    
            JTable newTable= new JTable(data, columnNames) {
                @Override
                public boolean isCellEditable(int row, int column) { // To make row and columns not editable
                    return false;
                }
            };
            newTable.setFillsViewportHeight(true);
            newTable.setAutoCreateRowSorter(true); // to activate sorting property of each column
    
            return newTable;
        }
    }