有一个主JFrame MainPanel
使用两个内部框架Read
和View
,Read
中有一个项目的JList,其中包含文件和按钮。
预期工作:Read
有一个填充了文件的JList。我将选择一个.txt文件,然后按下按钮和文件名(实际上我想输出内容,但为了简单起见让我们输出文件名)应该在View
JInternalFrame的JTextArea中输出
什么错误:
View
中初始化的MainPanel
无法在弹出错误的Read
中重新初始化。View viewPanel = new View()
JInternalFrame的点击按钮事件中使用Read
,则根本不会显示JInternalFrame。mainPanel中:
public MainPanel() {
initComponents();
pack();
insert = new Insert();
view = new View();
read = new Read();
jPanel2.add(insert);
jPanel2.add(view);
jPanel2.add(read);
insert.setVisible(true); // Initially only insert is visible later on
view.setVisible(false); // I have buttons which set's the view and
read.setVisible(false); // read visible
}
阅读:
public class Read extends javax.swing.JInternalFrame {
public Read() {
initComponents();
pack();
DefaultListModel model = new DefaultListModel();
jList1.setModel(model);
File folder = new File("/home/Naruto/Dattebayo");
File[] listOfFiles = folder.listFiles();
for(File file : listOfFiles){
model.addElement(file.getName());
}
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String selected = (String) jList1.getSelectedValue();
view.setText(selected); // **Error**
view.setVisible(true); // **View is'nt visible here**
this.setVisible(false);
}
}
答案 0 :(得分:1)
你问:
如何从另一个JInternalFrame初始化JInternalFrame?
但事实上,你的真正整体问题实际上是:
如何将信息从一个对象传递到另一个对象。
就是这样,实际上这与Swing或GUI(我的答案的最初部分)没什么关系,但它是一个基本的Java问题。您看到的问题是,如果在Read对象中创建一个新的View对象,您可以更改此View实例的状态,但它对可视化View实例没有任何影响,因为它们是两个完全唯一且不同的对象。
一个 BAD 解决方案是在View静态中创建关键字段和方法,这将允许您使用类级别字段和方法将信息从一个对象传递到另一个对象,但这会破坏OOP设计,增加代码的圈复杂度使得调试或增强或扩展变得更加困难。
更好的解决方案是简单地传递可视化View实例,实际显示在Read实例中的那个,然后在其上调用方法。例如:
public class Read extends javax.swing.JInternalFrame {
private View view; // *******
// give the constructor a View parameter
public Read(View view) {
this.view = view; // ***** update the view field
initComponents();
pack();
DefaultListModel model = new DefaultListModel();
jList1.setModel(model);
File folder = new File("/home/Naruto/Dattebayo");
File[] listOfFiles = folder.listFiles();
for(File file : listOfFiles){
model.addElement(file.getName());
}
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String selected = (String) jList1.getSelectedValue();
// this should work now
view.setText(selected);
view.setVisible(true);
this.setVisible(false);
}
}
然后在创建两个类时传递视图
public MainPanel() {
initComponents();
pack();
insert = new Insert();
view = new View();
read = new Read(view); // *********
jPanel2.add(insert);
jPanel2.add(view);
jPanel2.add(read);
insert.setVisible(true); // Initially only insert is visible later on
view.setVisible(false); // I have buttons which set's the view and
read.setVisible(false); // read visible
}
请注意,更好整体解决方案(确实考虑到您的GUI程序)是将程序结构更改为模型 - 视图 - 控件或MVC结构(我劝你谷歌这个)。这样做的好处是虽然它最初似乎会增加代码的复杂性,但它会更好地扩展,并且从长远来看会降低代码的复杂性,极大会降低耦合并提高内聚力(主要是为什么它降低了复杂性并使其多更容易调试,因为程序的各个部分将被单独隔离可测试单元。