Java 从另一个类更新jtextarea

Java 从另一个类更新jtextarea,java,swing,Java,Swing,我有两门课 主要 潜艇 在主课堂上,我有一个按钮和一个区域 在小班,我有一个按钮 当我单击main类中的按钮时,子类运行并显示一个按钮。当我按下子类中的按钮时,jtextarea应该显示值“Sample text”,但jtextarea没有显示任何文本 子类代码 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { Main main = new Main(); main.jTextArea1

我有两门课

  • 主要

  • 潜艇

  • 在主课堂上,我有一个按钮和一个区域

    在小班,我有一个按钮

    当我单击main类中的按钮时,子类运行并显示一个按钮。当我按下子类中的按钮时,jtextarea应该显示值“Sample text”,但jtextarea没有显示任何文本

    子类代码

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        Main main = new Main();
        main.jTextArea1.setText("Sample text");
    }
    

    只要
    main
    引用指向的是对象,而不是类本身,它就应该工作!但是,您应该检查jTextArea1是公共的还是私有的。如果private生成一个
    getTextArea()
    方法,则返回textarea并调用该方法(通常这是一个更好的主意)。如果从
    主类调用
    子类
    ,并且main是
    父类
    ,请尝试获取
    根窗格
    (例如,sub是JDialog)。尝试在外部(在另一个类中)创建一个主窗口,看看它是如何运行的。这解决了我在不同帧和对话框之间调用时的问题

    只要
    main
    引用指向的是对象,而不是类本身,它就应该工作!但是,您应该检查jTextArea1是公共的还是私有的。如果private生成一个
    getTextArea()
    方法,则返回textarea并调用该方法(通常这是一个更好的主意)。如果从
    主类调用
    子类
    ,并且main是
    父类
    ,请尝试获取
    根窗格
    (例如,sub是JDialog)。尝试在外部(在另一个类中)创建一个主窗口,看看它是如何运行的。这解决了我在不同帧和对话框之间调用时的问题

    您不应该新建Main,然后您会得到一个不同的对象(可能没有设置为可见),并且不会显示任何内容。您需要做的是为主对象(显示的对象)创建一个局部变量,并在Sub中创建一个构造函数,如下所示:

    private Main main;
    public Sub(final Main main) {
        this.main = main();
    }
    
    main.displayText("Sample text");
    
    然后,当您从Main实例化Sub时:

    final Sub sub = new Sub(this);
    
    那么你在Sub中的行为可以说:

    main.jTextArea1.setText("Sample text")
    
    或者更好:

    main.getjTextArea1().setText("Sample text");
    
    您应该始终保持变量的私有性,并使用方法来操作它们、getter和setter或其他。例如,您可以这样做:

    private Main main;
    public Sub(final Main main) {
        this.main = main();
    }
    
    main.displayText("Sample text");
    

    这样,Sub就不需要知道任何关于Main文本区域的信息,这是一件好事。

    您不应该新建Main,然后您会得到一个不同的对象(可能未设置为可见),并且不会显示任何内容。您需要做的是为主对象(显示的对象)创建一个局部变量,并在Sub中创建一个构造函数,如下所示:

    private Main main;
    public Sub(final Main main) {
        this.main = main();
    }
    
    main.displayText("Sample text");
    
    然后,当您从Main实例化Sub时:

    final Sub sub = new Sub(this);
    
    那么你在Sub中的行为可以说:

    main.jTextArea1.setText("Sample text")
    
    或者更好:

    main.getjTextArea1().setText("Sample text");
    
    您应该始终保持变量的私有性,并使用方法来操作它们、getter和setter或其他。例如,您可以这样做:

    private Main main;
    public Sub(final Main main) {
        this.main = main();
    }
    
    main.displayText("Sample text");
    

    这样,Sub就不需要知道任何关于主文本区域的信息,这是一件好事。

    我已经对Sub类中的代码做了更改,我应该做什么更改,目前我有,public void run(){new Sub().setVisible(true);},因为Sub()已经变成了Sub(final Main Main)现在,run()方法是静态的吗?是从Main打来的吗?如果是,则将其更改为public void run(final Main Main),并调用new Sub(Main).setVisible(true);好的,似乎一切都很好,我应该如何处理这段代码,netbeans自动实现,@Override public void run(){throw new UnsupportedOperationException(“Not supported”);}这意味着它可能是一个在接口中定义的方法,您必须实现。但是您不应该在此方法中执行新的Sub(),因为在其中意味着您已经在子对象中。将其更改为this.setVisible(true);我已经对Sub类中的代码做了更改,我应该做什么更改,目前我有,public void run(){new Sub().setVisible(true);}因为Sub()现在已经成为Sub(final Main Main)。run()方法是静态的吗?是从Main打来的吗?如果是,则将其更改为public void run(final Main Main),并调用new Sub(Main).setVisible(true);好的,似乎一切都很好,我应该如何处理这段代码,netbeans自动实现,@Override public void run(){throw new UnsupportedOperationException(“Not supported”);}这意味着它可能是一个在接口中定义的方法,您必须实现。但是您不应该在此方法中执行新的Sub(),因为在其中意味着您已经在子对象中。将其更改为this.setVisible(true);