java - 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;
}
}
});
解决方案
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
Loadable
and if it is, you cast it and call its load
method...
tp.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
Component selectedComponent = tp.getSelectedComponent();
if (selectedComponent instanceof Loadable) {
((Loadable)selectedComponent).load();
}
}
}
推荐阅读
- ruby-on-rails - 如何使用设计在 ruby on rails 中创建辅助登录表单
- javascript - 为什么这个 JS/jQuery 作用于多个输入?
- java - Socket 程序中的错误,它发送空白消息并且在每条消息之前都有一些奇怪的符号
- javascript - JavaScript上的DOM操作实践---请帮助
- networking - 使用 Go-Back-N 的 ACK 号是多少?
- c# - 读取列表中包含重复数据的所有数据
- android - 将我的motog plus更新为orieo后,热点说没有互联网
- django - 夹层模板如何工作?
- python - Python json 抓取我的日期为 'DueDate': '/Date(1539205200000)/' 。我没有得到日期格式
- reactjs - 启动 create-react-app 项目期间出现未处理的错误