Java 当我点击Run按钮时,我的JFrame不会出现,尽管NetBeans说它正在运行

Java 当我点击Run按钮时,我的JFrame不会出现,尽管NetBeans说它正在运行,java,sql,Java,Sql,我用NetBeans创建了一个简单的表单。一切都很好,但当我为JTabel添加一些代码时,当我点击run时,它不会显示任何内容。 这是我的代码: public final class QuanLy extends javax.swing.JFrame { public QuanLy() { initComponents(); show(); } public ArrayList<Subject> subjectList(){

我用NetBeans创建了一个简单的表单。一切都很好,但当我为JTabel添加一些代码时,当我点击run时,它不会显示任何内容。 这是我的代码:

public final class QuanLy extends javax.swing.JFrame {
    public QuanLy() {
        initComponents();
        show();
    }

    public ArrayList<Subject> subjectList(){
        ArrayList<Subject> subjectsList = new ArrayList<>();
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            String url = "jdbc:sqlserver://localhost;databaseName=QLLTCK;integratedSecurity=true;";
            Connection connection = DriverManager.getConnection(url);
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("SELECT * FROM PHANCONG");

            while(resultSet.next()){
                Subject subject = new Subject(resultSet.getString("maLop"), resultSet.getString("tenMH"), 
                        resultSet.getString("ngayThi"), resultSet.getInt("caThi"), resultSet.getString("phongThi"), 
                        resultSet.getInt("soSV"), resultSet.getInt("soCBCT"), resultSet.getString("xepLoai"));
                subjectsList.add(subject);
            }
        }
        catch(Exception sqlex){
            sqlex.printStackTrace();
        }        
        return subjectsList;
    }

    @Override
    public void show(){
        ArrayList<Subject> list = subjectList();
        DefaultTableModel model = (DefaultTableModel)table.getModel();
        Object[] row = new Object[8];
        for(int i = 0; i < list.size(); i++){
            row[0] = list.get(i).getMaLop();
            row[1] = list.get(i).getTenMH();
            row[2] = list.get(i).getNgayThi();
            row[3] = list.get(i).getCaThi();
            row[4] = list.get(i).getPhongThi();
            row[5] = list.get(i).getSoSV();
            row[6] = list.get(i).getSoCBCT();
            row[7] = list.get(i).getXepLoai();
            model.addRow(row);
        }
    }
//... (those lines are created by NetBeans)
}
当我对show、public ArrayList subjectList和public void show进行注释时,我的表单会正常显示

这是图像。跑步但不显示。

这是一个没有代码的项目。

有人能帮我吗?谢谢


对不起,我的英语不好。

您正在重写show函数,但没有实现显示逻辑或调用super show。最简单的方法是在show函数的末尾调用super.show

您正在覆盖show函数,但没有实现显示逻辑或调用super show。最简单的方法是在show函数的末尾调用super.show

首先,show方法已被弃用。您应该改用setVisibletrue

其次,在构造函数中执行可重写的方法调用不是一个好做法,因为这可能会导致不希望出现的bug。构造函数不应直接或间接调用可重写方法,因为超类构造函数在子类构造函数之前运行,因此子类中的重写方法将在子类构造函数运行之前调用。如果重写方法依赖于子类构造函数执行的任何初始化,则该方法将不会按预期的方式运行

例如,您可以将show方法重命名为initTable,并在创建表单之后调用它。例如,如果您在main方法中创建,您可以执行以下操作:

public static void main(String[] args) {
     QuanLy frame = new QuanLy();

     // ... other initialization stuff ...

     frame.setVisible(true);
     frame.initTable(); // the initTable is you show() method renamed

     // ... rest of your code ...

}
首先,show方法已被弃用。您应该改用setVisibletrue

其次,在构造函数中执行可重写的方法调用不是一个好做法,因为这可能会导致不希望出现的bug。构造函数不应直接或间接调用可重写方法,因为超类构造函数在子类构造函数之前运行,因此子类中的重写方法将在子类构造函数运行之前调用。如果重写方法依赖于子类构造函数执行的任何初始化,则该方法将不会按预期的方式运行

例如,您可以将show方法重命名为initTable,并在创建表单之后调用它。例如,如果您在main方法中创建,您可以执行以下操作:

public static void main(String[] args) {
     QuanLy frame = new QuanLy();

     // ... other initialization stuff ...

     frame.setVisible(true);
     frame.initTable(); // the initTable is you show() method renamed

     // ... rest of your code ...

}

建议这样做

SwingUtilities.invokeLater->{ frame.pack; frame.setVisibletrue; }; lambda还可以替换为可运行对象,并覆盖其run方法


不要使用.show方法,因为它已被弃用

建议这样做

SwingUtilities.invokeLater->{ frame.pack; frame.setVisibletrue; }; lambda还可以替换为可运行对象,并覆盖其run方法


不要使用.show方法,因为它已被弃用

多谢各位。我刚刚将show方法重命名为show_Table方法,它工作得非常好。谢谢。我只是将show方法重命名为show_Table方法,它工作得非常好。