java - 表的前一个实例会追加到新调用的表中。页面应该只显示一张表

标签 java user-interface jtable

当我单击名为“已注册主题”的按钮时,将调用一个显示已注册主题的表格。数据是从文本文件加载的。但是,当我转到应用程序的另一个页面并返回到“已注册主题”或再次单击“已注册主题”按钮时,会加载一个新表并将其添加到之前加载的表中。这使得每次我单击“已注册主题”时表格都会变长。我添加了一个removeAll()方法,该方法在再次加载表之前清除 Pane 的内容,但由于某种原因,先前加载的表不会消失。

这是附加表格的面板的代码。

  public class EnrolledSubjectsPanel extends JPanel
    {
        public EnrolledSubjectsPanel(String path)
        {

            setBackground(Color.LIGHT_GRAY);
            setBounds(183, 280, 1129, 401);
            setLayout(null);

            LoadTable table = new LoadTable(path);
            table.setBounds(0,60,1129,600);
            add(table);

            JLabel lblEnrolledSubjects = new JLabel("Enrolled Subjects");
            lblEnrolledSubjects.setFont(new Font("Tahoma", Font.PLAIN, 35));
            lblEnrolledSubjects.setBounds(446, 0, 292, 43);
            add(lblEnrolledSubjects);
            setVisible(true);
        }
    }

创建表的类

    public class LoadTable extends JPanel
    {
        private static String path;
        private static  String header[] = {"Subject", "Schedule", "Room", "Proferssor", "Units"};
        private static  DefaultTableModel dtm = new DefaultTableModel(null, header);
        boolean isLaunched;
        public LoadTable(String path)
        {
            this.path = "subjects" + path;

            setBackground(Color.LIGHT_GRAY);
            setBounds(183, 280, 1129, 401);
            setLayout(null);

            JTable table = new JTable(dtm);
            JScrollPane jsp = new JScrollPane(table);
            jsp.setBounds(0, 0, 1129, 380); 
            add(jsp);

            try
            {
            TextReaderBasic file = new TextReaderBasic(path);
            String data[] = file.openFile();
            int i = 0;
            for(i = 0; i <= data.length; i++)
            {

                addRow(i);
            }

            }
            catch(Exception e)
            {
                System.out.println(e.getMessage());
            }
            setVisible(true);
        }

        public static void addRow(int x)
        {   
            try
            {       
            TextReaderBasic file = new TextReaderBasic(path);
            String data[] = file.openFile();
            int size = data.length;
            int i = 0 + x;
            int j = 6 + x;
            int k = 12 + x;
            int l = 18 + x;
            int m = 24 + x;

            dtm.addRow(new Object[]{data[i], data[j], data[k], data[l], data[m]});
            }
            catch(Exception e)
            {
                System.out.println("Action completed :)");
            }       
        }
    }

面板附加到的主类

public class LaunchPage extends JFrame
{   public LaunchPage(String path) 
    {
        getContentPane().setBackground(Color.white);
        getContentPane().setLayout(null);

        StudentBasicInformationPanel studentBasicInfo = new StudentBasicInformationPanel(path);
        getContentPane().add(studentBasicInfo);

        JLabel universityTitleL = new JLabel("Evil Genuises University");
        universityTitleL.setFont(new Font("Edwardian Script ITC", Font.ITALIC, 42));
        universityTitleL.setBounds(514, 11, 343, 65);
        getContentPane().add(universityTitleL);

        JPanel panelToAttach = new JPanel();
        panelToAttach.setBounds(173, 280, 1129, 404);
        getContentPane().add(panelToAttach);
        setSize(1366, 768);

        JButton enrollmentButton = new JButton("Enrollment");
        enrollmentButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) 
            {
            panelToAttach.removeAll();

            EnrollmentPanel ep = new EnrollmentPanel();
            ep.setBackground(Color.LIGHT_GRAY);
            ep.setBounds(0, 0, 1129, 401);
            panelToAttach.add(ep);
            repaint();
            }
        });
        enrollmentButton.setBounds(10, 280, 157, 58);
        getContentPane().add(enrollmentButton);

        JButton viewEnrolledSubjectsButton = new JButton("Enrolled Subjects");
        viewEnrolledSubjectsButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) 
            {
                panelToAttach.removeAll();
                EnrolledSubjectsPanel es = new EnrolledSubjectsPanel(path);
                es.setBackground(Color.LIGHT_GRAY);
                es.setBounds(0, 0, 1129, 401);
                panelToAttach.add(es);  
                repaint();
            }
        });
        viewEnrolledSubjectsButton.setBounds(10, 349, 157, 58);
        getContentPane().add(viewEnrolledSubjectsButton);

        JButton viewGradesButton = new JButton("View Grades");
        viewGradesButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0)
            {
                panelToAttach.removeAll();
                GradesPanel gp = new GradesPanel();
                gp.setBackground(Color.LIGHT_GRAY);
                gp.setBounds(0, 0, 1129, 401);
                panelToAttach.add(gp);
                repaint();
            }
        });
        viewGradesButton.setBounds(10, 418, 157, 58);
        getContentPane().add(viewGradesButton);

        JButton clearanceButton = new JButton("Clearance");
        clearanceButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) 
            {
                panelToAttach.removeAll();
                ClearancePanel cp = new ClearancePanel();
                cp.setBackground(Color.LIGHT_GRAY);
                cp.setBounds(0, 0, 1129, 401);
                panelToAttach.add(cp);
                repaint();
            }
        });
        clearanceButton.setBounds(10, 487, 157, 58);
        getContentPane().add(clearanceButton);

        JButton viewAccountButton = new JButton("View Account");
        viewAccountButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) 
            {
                panelToAttach.removeAll();
                AccountPanel ap = new AccountPanel();
                ap.setBackground(Color.LIGHT_GRAY);
                ap.setBounds(0, 0, 1129, 401);
                panelToAttach.add(ap);
                repaint();
            }
        });
        viewAccountButton.setBounds(10, 556, 157, 58);
        getContentPane().add(viewAccountButton);

        JButton closeButton = new JButton("Close");
        closeButton.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent e) 
            {
                System.exit(0);
            }
        });

        closeButton.setBounds(10, 626, 157, 58);
        getContentPane().add(closeButton);

        setVisible(true);
    }
}

提前致谢!

最佳答案

在将行添加到表中之前,请尝试在 LoadTable 类中使用以下代码。它将清除表模型中的行。

 dtm.setRowCount(0);

因此,您的新 LoadTable 类应如下所示:

public class LoadTable extends JPanel
{
    private static String path;
    private static  String header[] = {"Subject", "Schedule", "Room", "Proferssor", "Units"};
    private static  DefaultTableModel dtm = new DefaultTableModel(null, header);
    dtm.setRowCount(0);  //THIS WILL CLEAR THE ROWS IN YOUR STATIC TABLEMODEL
    boolean isLaunched;
    public LoadTable(String path)
    {
        this.path = "subjects" + path;

        setBackground(Color.LIGHT_GRAY);
        setBounds(183, 280, 1129, 401);
        setLayout(null);

        JTable table = new JTable(dtm);
        JScrollPane jsp = new JScrollPane(table);
        jsp.setBounds(0, 0, 1129, 380); 
        add(jsp);

        try
        {
        TextReaderBasic file = new TextReaderBasic(path);
        String data[] = file.openFile();
        int i = 0;
        for(i = 0; i <= data.length; i++)
        {

            addRow(i);
        }

        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        setVisible(true);
    }

    public static void addRow(int x)
    {   
        try
        {       
        TextReaderBasic file = new TextReaderBasic(path);
        String data[] = file.openFile();
        int size = data.length;
        int i = 0 + x;
        int j = 6 + x;
        int k = 12 + x;
        int l = 18 + x;
        int m = 24 + x;

        dtm.addRow(new Object[]{data[i], data[j], data[k], data[l], data[m]});
        }
        catch(Exception e)
        {
            System.out.println("Action completed :)");
        }       
    }
}

关于java - 表的前一个实例会追加到新调用的表中。页面应该只显示一张表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35766440/

相关文章:

java - 流列表成一个集合

Java 程序无法在 linux 中挂载的系统上写入

linux - 终端:在窗口中打开当前路径?

java - 在 java 中寻找用于音频控件的开源 gui 组件

Android 设计 UI 元素 PSD

java - 我的 Jar 应用程序(myapplication.jar + Mysql 连接器)无法在其他计算机上运行

java - JTable Oracle Timestamp 列不显示

java - 如何根据以前的单元格值更改 JTable 的单元格背景?

java - 使用 JCreator 将行添加到 JTable

java.io.FileNotFoundException : class path resource [src/main/webapp/WEB-INF/spring/appServlet/servlet-context. xml]