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

时间:2015-02-02 09:03:04

标签: java class main

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

4 个答案:

答案 0 :(得分:1)

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

public class ConsoleDebug extends MainClass{

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

答案 1 :(得分:1)

如果extends关键字出现错误,请写下

public void writeTextArea(String string) 

方法

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

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

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

答案 2 :(得分:0)

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

在您的ConsoleDebug定义中写下:

public class ConsoleDebug extends MainClass { 
 ...
}

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

答案 3 :(得分:0)

有几种方法可以完成这项工作,一个简单的方法就是可以定义方法writeTextArea static。为此,您需要将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,你就可以完成任务。