有一个主JFrame MainPanel使用两个内部框架Read和View,Read中有一个由文件和按钮填充的项的JList。
预期工作的:Read有一个由文件填充的JList。我将选择一个.txt文件并按下按钮,文件名(实际上我想输出内容,但为了简单起见,让我们输出文件名)应该在JTextArea of View JInternalFrame中输出。
出了什么问题:
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);
}
}发布于 2015-07-25 19:44:30
你问:
如何从另一个JInternalFrame初始化JInternalFrame?
但简单地说,你真正真正的问题是:
如何将信息从一个对象传递到另一个对象。
仅此而已,这与Swing或GUI (对于我的答案的最初部分)没有什么关系,而是一个基本的Java问题。您所看到的问题是,如果在读取对象的内部创建一个新的View对象,您可以更改这个View实例的状态,但是它不会对可视化的View实例产生影响,因为它们是两个完全唯一和不同的对象。
一个坏的解决方案是在视图静态中创建关键字段和方法,这将允许您使用类级别的字段和方法将信息从一个对象传递到另一个对象,但这会破坏OOP设计,会增加代码的圈复杂度,从而使调试、增强或扩展变得更加困难。
更好的解决方案是简单地传递可视化视图实例,这个实例实际上正在显示在读取实例中,然后调用该实例上的方法。例如:
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结构(我敦促您在谷歌上搜索这个结构)。这样做的好处是,虽然它最初似乎会增加代码的复杂性,但它的扩展性要好得多,而且从长远来看,大大降低了代码的复杂性,大大降低了耦合,提高了凝聚力(这也是它降低复杂性的主要原因),并使其更易于调试,因为程序的各个部分将是单独的可测试单元。
https://stackoverflow.com/questions/31628712
复制相似问题