Java 在子 class 中调用函数或使用 Main class 中的对象

Java calling function or using object from Main class in sub class

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

主要class:

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

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

子 class:

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) 函数。任何想法为什么这样做?谢谢!

你说ConsoleDebug是子class。也许您需要这样声明:

public class ConsoleDebug extends MainClass{

这样您就可以从 ConsoleDebug 调用 writeTextArea,因为它是主 class.

的真正子 class

如果 ConsoleDebugMainClass class 的子class,那么您需要使用扩展关键字。

在您的 ConsoleDebug 定义中写入:

public class ConsoleDebug extends MainClass { 
 ...
}

MainClass 中的所有 public/protected 方法都可以在 ConsoleDebug class.

中使用

如果 extends 关键字出错,那么写下你的

public void writeTextArea(String string) 

方法为

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

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

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

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

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,你就搞定了。