【问题标题】:Java calling function or using object from Main class in sub classJava调用函数或使用子类中主类的对象
【发布时间】:2026-01-19 04:15:02
【问题描述】:

我需要一些 Java 代码方面的帮助。我有 Main 类,其中定义了 GUI 中的所有对象,因此我创建了一个用于将文本附加到 Main 类中的 TextArea 的函数,现在我需要从 Sub 类调用该函数以将文本附加到文本区域。

主类:

public static String newline = System.getProperty("line.separator");    
ConsoleDebug debug = new ConsoleDebug();

    public void writeTextArea(String string) {
        jTextArea2.append(string);
    }

子类:

package AppPackage;

import static AppPackage.MainGUI.newline;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.Calendar;

//Debuging console
public class ConsoleDebug {
    public java.sql.Timestamp currentTimestamp() {
        Calendar calendar = Calendar.getInstance();
        java.sql.Timestamp timestamp = new java.sql.Timestamp(calendar.getTime().getTime());
        return timestamp;
    }

    //Message
    public void message(String newText) {
        logWrite("",newText);
    }

    //Info message
    public void info(String newText) {
        logWrite("|INFO| ",newText);
    }

    //Error message
    public void error(String newText) {
        logWrite("|ERROR| ",newText);
    }

    //Critical message
    public void critical(String newText) {
        logWrite("|CRITICAL| ",newText);
    }

    //Write to log
    private void logWrite(String prefix, String newText) {
        writeTextArea("[" + currentTimestamp() + "] " + prefix + newText + newline);

        File launcherLog = new File("launcher.log");
        if(!launcherLog.exists() || launcherLog.isDirectory()) {
            // Stream to write file
            FileOutputStream fout;      
            try
            {
                // Open an output stream
                fout = new FileOutputStream("launcher.log");

                // Print a line of text
                PrintStream stream = new PrintStream(fout);
                stream.println("[" + currentTimestamp() + "] " + prefix + newText);

        // Close our output stream
        fout.close();       
            }
            // Catches any error conditions
            catch (IOException e)
            {
                System.err.println("Unable to create log file");
            }
        }
        else {
            try {
                PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("launcher.log", true)));
                out.println("[" + currentTimestamp() + "] " + prefix  + newText);
                out.close();
            } catch (IOException e) {
                //exception handling left as an exercise for the reader
                System.err.println("Unable to edit log file");
            }
        }
    }
}

我认为看起来还可以,但是错误

"Can't find symbol writeTextArea(String)"

当我尝试时出现

writeTextArea("[" + currentTimestamp() + "] " + prefix + newText + newline);

来自我的私人 logWrite(String, String) 函数。任何想法为什么会这样做?谢谢!

【问题讨论】:

    标签: java class main


    【解决方案1】:

    你说ConsoleDebug 是一个子类。也许你需要这样声明:

    public class ConsoleDebug extends MainClass{
    

    这样您就可以从ConsoleDebug 调用writeTextArea,因为它是主类的真正子类。

    【讨论】:

    • 我已经尝试过扩展 MainClass 但这给了我另一个错误:线程 "AWT-EventQueue-0" java.lang.*Error at sun.awt.Win32GraphicsConfig.getBounds(Native Method) 中的异常sun.awt.Win32GraphicsConfig.getBounds(Win32GraphicsConfig.java:222) 在 java.awt.Window.init(Window.java:505) 在 java.awt.Window.(Window.java:537) 在 java.awt .Frame.(Frame.java:420) 在 java.awt.Frame.(Frame.java:385) 在 javax.swing.JFrame.(JFrame.java:181) 在 AppPackage。 MainGUI.(MainGUI.java:29) 在 AppPackage.ConsoleDebug.(ConsoleDebug.java:24) ......
    • 你必须使用你的主类的名字而不是`MainClass'(我不知道)。
    • 它在 MainGUI.java:24 和 ConsoleDebug.java:24) 上积压,它们是 ConsoleDebug debug = new ConsoleDebug();和公共类 ConsoleDebug 扩展 MainGUI {
    • 当你创建一个新的 ConsoleDebug 时,你也在创建一个主类对象(因为它是父类),它正在创建一个新的 ConsoleDebug 等。你可以将 ConsoleDebug 对象作为构造函数参数而不是创建它。或者使用 setter 方法。
    【解决方案2】:

    如果 extends 关键字给出错误然后写你的

    public void writeTextArea(String string) 
    

    方法

    public static void writeTextArea(String string) 
    {
        jTextArea2.append(string);
    }
    

    并简单地以 class_name.method 名称访问方法,即

    Main.writeTextArea("[" + currentTimestamp() + "] " + prefix + newText + newline);
    

    【讨论】:

      【解决方案3】:

      如果ConsoleDebugMainClass 类的子类,则需要使用extend 关键字。

      在您的 ConsoleDebug 定义中写下:

      public class ConsoleDebug extends MainClass { 
       ...
      }
      

      MainClass 中的所有公共/受保护方法都可以在 ConsoleDebug 类中使用。

      【讨论】:

      • 但是我不能添加 SubClass debug = new SubClass();到主类并调用子类的函数,这就是问题
      【解决方案4】:

      有几种方法可以完成这项工作,一种简单的方法是您可以将方法 writeTextArea 定义为静态。为此,您还需要将 jTextArea2 定义为静态,并在新建 ConsoleDebug 之前对其进行初始化。由于您没有给出完整的主要内容,我只能给您一个草稿:

      public class Main {
          static JTextArea jTextArea2;
      
          public static void main() {
              jTextArea2 = ...;
              ConsoleDebug debug = new ConsoleDebug();
              ....
          }
      
          public static void writeTextArea(String string) {
              jTextArea2.append(string);
          }
      }
      

      然后你可以在你的子类中把writeTextArea改成Main.writeTextArea,你就搞定了。

      【讨论】:

        最近更新 更多