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
如果 ConsoleDebug
是 MainClass
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,你就搞定了。
我需要一些 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.
如果 ConsoleDebug
是 MainClass
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,你就搞定了。