首页 > 解决方案 > JTabbedPane 更改侦听器以从文件中读取

问题描述

我有一个包含 7 个选项卡的 JTabbedPane,每个选项卡都包含一个扩展 JPanel 的类,我需要的是,如果我在任何选项卡中更改并保存到文件,所做的更改可以在其他选项卡中使用,而无需关闭程序并再次运行它

我将标签添加到 JTabbedPane

tp.addTab("   Etudiant   ", new Etudiant());
            tp.addTab("   Enseignant   ", new Enseignant());
            tp.addTab("   Cours   ", new Cours());
            tp.addTab("   Groupes   ", new Groupe());
            tp.addTab("   Inscription   ", new Inscription());
            tp.addTab("   Horaires   ", new Horaires());
            tp.addTab("   Resultats   ", new Resultats());
            tp.addTab("   Divers   ", new Divers());

然后我创建了一个更改侦听器以在每次选择选项卡时从文件中读取,我需要使用从类(每个选项卡的)文件中读取的 ArrayList

tp.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                switch (tp.getSelectedIndex()) {
                    case 3:

                        if (file3.length() > 0) {
                            try {
                                ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Cours.out"));
                                listCours = (ArrayList) ois.readObject();

                                System.out.println("cours read");
                                System.out.println(listCours);
                            } catch (Exception ex) {
                                ex.printStackTrace();
                            }
                        } else {
                            listCours = new ArrayList();
                        }
                        if (file4.length() > 0) {
                            try {
                                ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Inscriptions.out"));
                                listIns = (ArrayList) ois.readObject();

                                System.out.println("insc read");
                            } catch (Exception ex) {
                                ex.printStackTrace();
                            }
                        } else {
                            listIns = new ArrayList();
                        }

                        break;

                    case 4:

                        if (file.length() > 0) {
                            try {
                                ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Etudiants.out"));
                                listEtud = (ArrayList) ois.readObject();

                                System.out.println("etud read");
                            } catch (Exception ex) {
                                ex.printStackTrace();
                            }
                        } else {
                            listEtud = new ArrayList();
                        }
                        if (file2.length() > 0) {
                            try {
                                ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Groupes.out"));
                                listGroupes = (ArrayList) ois.readObject();

                                System.out.println("group read");
                            } catch (Exception ex) {
                                ex.printStackTrace();
                            }
                        } else {
                            listGroupes = new ArrayList();
                        }
                        if (file3.length() > 0) {
                            try {
                                ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Cours.out"));
                                listCours = (ArrayList) ois.readObject();

                                System.out.println("cours read");
                            } catch (Exception ex) {
                                ex.printStackTrace();
                            }
                        } else {
                            listCours = new ArrayList();
                        }
                        break;
                    case 5:
                        break;

                    case 6:

                        break;

                    default:
                        break;
                }
            }
        });

标签: javaswingjtabbedpane

解决方案


ChangeListener在选择选项卡时决定应该做什么不是他们的责任。相反,您需要某种方式来指示选定的选项卡在被选中时应该执行它需要执行的任何操作。这将代码解耦并允许您更改选项卡的顺序而不影响其余代码。

首先定义一个可加载的东西的简单概念......

public interface Loadable {
    public void load();
}

然后,您希望在选项卡选择更改时收到通知的每个选项卡/面板都应实现此功能interface

public class LoadableTabPane extends JPanel implements Loadabel {
    //...
    public void load() {
        // Performing the loading here
    }
}

Then when the tab selection changes, you inspect the selected component to determine of it's an instanceof Loadableand if it is, you cast it and call its loadmethod...

tp.addChangeListener(new ChangeListener() {
    @Override
    public void stateChanged(ChangeEvent e) {
        Component selectedComponent = tp.getSelectedComponent();
        if (selectedComponent instanceof Loadable) {
            ((Loadable)selectedComponent).load();
        }
    }
}

推荐阅读