首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将信息从一个对象传递到另一个对象

如何将信息从一个对象传递到另一个对象
EN

Stack Overflow用户
提问于 2015-07-25 16:34:10
回答 1查看 51关注 0票数 0

有一个主JFrame MainPanel使用两个内部框架ReadViewRead中有一个由文件和按钮填充的项的JList。

预期工作的Read有一个由文件填充的JList。我将选择一个.txt文件并按下按钮,文件名(实际上我想输出内容,但为了简单起见,让我们输出文件名)应该在JTextArea of View JInternalFrame中输出。

出了什么问题

  1. ViewMainPanel中初始化,不能在Read中重新初始化,从而弹出错误。
  2. 如果在View viewPanel = new View() JInternalFrame的单击按钮事件中使用Read,则根本不会显示JInternalFrame。

MainPanel:

代码语言:javascript
复制
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

}

案文如下:

代码语言:javascript
复制
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);       
}                                        
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-25 19:44:30

你问:

如何从另一个JInternalFrame初始化JInternalFrame?

但简单地说,你真正真正的问题是:

如何将信息从一个对象传递到另一个对象。

仅此而已,这与Swing或GUI (对于我的答案的最初部分)没有什么关系,而是一个基本的Java问题。您所看到的问题是,如果在读取对象的内部创建一个新的View对象,您可以更改这个View实例的状态,但是它不会对可视化的View实例产生影响,因为它们是两个完全唯一和不同的对象。

一个坏的解决方案是在视图静态中创建关键字段和方法,这将允许您使用类级别的字段和方法将信息从一个对象传递到另一个对象,但这会破坏OOP设计,会增加代码的圈复杂度,从而使调试、增强或扩展变得更加困难。

更好的解决方案是简单地传递可视化视图实例,这个实例实际上正在显示在读取实例中,然后调用该实例上的方法。例如:

代码语言:javascript
复制
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);       
    }                                        
}

,然后在创建两个类时传递视图。

代码语言:javascript
复制
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结构(我敦促您在谷歌上搜索这个结构)。这样做的好处是,虽然它最初似乎会增加代码的复杂性,但它的扩展性要好得多,而且从长远来看,大大降低了代码的复杂性,大大降低了耦合,提高了凝聚力(这也是它降低复杂性的主要原因),并使其更易于调试,因为程序的各个部分将是单独的可测试单元。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31628712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档