将 JFrame 传递给新创建的 Class 以从新创建的 class 接收日志数据
Pass an JFrame to new created Class to receive logdata from the new class
我真的很难在 google 上找到我特别寻找的东西,甚至在不知道任何特殊词的情况下正确解释它,sry。我正在开发我的第一个 SocketServer 并想用 GUI 扩展它。我想尝试的第一步是为服务器 activity 创建一个简单的日志窗口。我有一个 JFrame,可以将文本传递给它。
public class Logger {
private JFrame frame;
private JTextArea tArea;
private JScrollPane jsp;
private StringBuilder sb = new StringBuilder();
File file = new File("C://");
public static void main(String[] args) {
String logTitle = new String(args[0]);
new Logger(logTitle);
}
public Logger(String logTitle) {
init(logTitle);
frame.setVisible(true);
//logToLogger(); // function to append logdata to textarea
}
public void logToLogger(String logText) {
tArea.append(logText.toString());
tArea.setCaretPosition(tArea.getDocument().getLength());
}
private void init(String logTitle) {
frame = new JFrame();
frame.setSize(400, 400);
frame.setTitle(logTitle);
frame.setLocationRelativeTo(null);
tArea = new JTextArea();
jsp = new JScrollPane(tArea);
frame.add(jsp, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
我还有一个主 class 用于启动我的服务器。当启动 mainclass 时,应该启动一个记录器,然后我将把它传递给一个新启动的线程。
我的主要class
I WANT TO PASS THE LOGGER TO THE MYTHREAD CLASS ON THE LINE WHERE I WROTE THE INLINE COMMENT
import java.net.*;
import java.io.*;
import java.util.*;
public class Server {
public static void main(String[] args) {
Integer port = new Integer(args[0]);
String logTitle = new String(args[1]);
Logger log = new Logger(logTitle);
MyThread t = new MyThread(port, log); // thats the part i cant handle
log.logToLogger("Started on port " + port);
}
}
下面是我将如何开始一个话题
public class MyThread {
public static void main(int port, Logger log) {
log.logToLogger(port + "logged from MyThread");
}
}
看起来您还没有编写任何从套接字获取数据的内容。您只需要将 Logger
对象传递给 MyThread
构造函数,然后从 MyThread
.
调用 log.logToLogger(receivedText);
您的代码应如下所示:
public class MyThread implements Runnable {
private Logger log;
private ServerSocket socket;
public MyThread(int port, Logger log) {
this.log = log;
log.logToLogger("SocketServer opened on port "+port);
try {
socket = new ServerSocket(port);
} catch (IOException e) {
log.logToLogger(e.getMessage());
}
}
@Override
public void run() {
while(true) {
Socket server;
try {
server = socket.accept();
log.logToLogger("Connection from"+server.getRemoteSocketAddress());
BufferedReader reader = new BufferedReader(new InputStreamReader(server.getInputStream()));
log.logToLogger("Received:"+reader.readLine());
server.close();
} catch (IOException e) {
log.logToLogger(e.getMessage());
}
}
}
}
public static void main(String[] args) {
Integer port = new Integer(args[0]);
String logTitle = new String(args[1]);
Logger log = new Logger(logTitle);
MyThread t = new MyThread(port, log);
(new Thread(t)).start();
}
套接字代码改编自这里:http://www.bogotobogo.com/Java/tutorial/tcp_socket_server_client.php
在 windows、运行 telnet 127.0.0.1 1234
的 cmd 提示符下输入您的消息,它应该出现在 JFrame
假设您 运行 应用程序在端口 1234 上。
您可能应该扩展 run()
方法,使其比仅在接收到的线路上关闭更可靠。
嗯,在我看来你的入口点在几个 classes 中是模棱两可的......你可能想从 renaming/modifying 'main' 方法开始,除了你的actual main class 你想让它进入的地方。就目前而言,从事物的外观来看,您目前有几个可接受的程序入口点。特别是,如果您的代码按照您希望的方式执行,则 Logger
class 中的 'main' 方法将永远不会被调用,因此您可能不得不将该代码移到其他地方,也许给构造函数什么的。
此外,当 运行将您的 java 程序作为小程序时调用 init
,而当 运行作为独立程序时调用 public static void main(String[] args)
java 申请。但是,这两种方法都不会 运行 在同一个程序的开头。 在你的 Logger
class 你应该把代码移到 init
到构造函数中的适当位置。
Jonno_FTW 关于将 Logger 作为参数传递给构造函数也有一个好处。如果您想将 MyThread 用作线程(请参阅 http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html),您还需要扩展 Thread
class 或实现 Runnable
。之后,您将能够使用 MyThread.start()
.
实际启动线程
我真的很难在 google 上找到我特别寻找的东西,甚至在不知道任何特殊词的情况下正确解释它,sry。我正在开发我的第一个 SocketServer 并想用 GUI 扩展它。我想尝试的第一步是为服务器 activity 创建一个简单的日志窗口。我有一个 JFrame,可以将文本传递给它。
public class Logger {
private JFrame frame;
private JTextArea tArea;
private JScrollPane jsp;
private StringBuilder sb = new StringBuilder();
File file = new File("C://");
public static void main(String[] args) {
String logTitle = new String(args[0]);
new Logger(logTitle);
}
public Logger(String logTitle) {
init(logTitle);
frame.setVisible(true);
//logToLogger(); // function to append logdata to textarea
}
public void logToLogger(String logText) {
tArea.append(logText.toString());
tArea.setCaretPosition(tArea.getDocument().getLength());
}
private void init(String logTitle) {
frame = new JFrame();
frame.setSize(400, 400);
frame.setTitle(logTitle);
frame.setLocationRelativeTo(null);
tArea = new JTextArea();
jsp = new JScrollPane(tArea);
frame.add(jsp, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
我还有一个主 class 用于启动我的服务器。当启动 mainclass 时,应该启动一个记录器,然后我将把它传递给一个新启动的线程。
我的主要class
I WANT TO PASS THE LOGGER TO THE MYTHREAD CLASS ON THE LINE WHERE I WROTE THE INLINE COMMENT
import java.net.*;
import java.io.*;
import java.util.*;
public class Server {
public static void main(String[] args) {
Integer port = new Integer(args[0]);
String logTitle = new String(args[1]);
Logger log = new Logger(logTitle);
MyThread t = new MyThread(port, log); // thats the part i cant handle
log.logToLogger("Started on port " + port);
}
}
下面是我将如何开始一个话题
public class MyThread {
public static void main(int port, Logger log) {
log.logToLogger(port + "logged from MyThread");
}
}
看起来您还没有编写任何从套接字获取数据的内容。您只需要将 Logger
对象传递给 MyThread
构造函数,然后从 MyThread
.
log.logToLogger(receivedText);
您的代码应如下所示:
public class MyThread implements Runnable {
private Logger log;
private ServerSocket socket;
public MyThread(int port, Logger log) {
this.log = log;
log.logToLogger("SocketServer opened on port "+port);
try {
socket = new ServerSocket(port);
} catch (IOException e) {
log.logToLogger(e.getMessage());
}
}
@Override
public void run() {
while(true) {
Socket server;
try {
server = socket.accept();
log.logToLogger("Connection from"+server.getRemoteSocketAddress());
BufferedReader reader = new BufferedReader(new InputStreamReader(server.getInputStream()));
log.logToLogger("Received:"+reader.readLine());
server.close();
} catch (IOException e) {
log.logToLogger(e.getMessage());
}
}
}
}
public static void main(String[] args) {
Integer port = new Integer(args[0]);
String logTitle = new String(args[1]);
Logger log = new Logger(logTitle);
MyThread t = new MyThread(port, log);
(new Thread(t)).start();
}
套接字代码改编自这里:http://www.bogotobogo.com/Java/tutorial/tcp_socket_server_client.php
在 windows、运行 telnet 127.0.0.1 1234
的 cmd 提示符下输入您的消息,它应该出现在 JFrame
假设您 运行 应用程序在端口 1234 上。
您可能应该扩展 run()
方法,使其比仅在接收到的线路上关闭更可靠。
嗯,在我看来你的入口点在几个 classes 中是模棱两可的......你可能想从 renaming/modifying 'main' 方法开始,除了你的actual main class 你想让它进入的地方。就目前而言,从事物的外观来看,您目前有几个可接受的程序入口点。特别是,如果您的代码按照您希望的方式执行,则 Logger
class 中的 'main' 方法将永远不会被调用,因此您可能不得不将该代码移到其他地方,也许给构造函数什么的。
此外,当 运行将您的 java 程序作为小程序时调用 init
,而当 运行作为独立程序时调用 public static void main(String[] args)
java 申请。但是,这两种方法都不会 运行 在同一个程序的开头。 在你的 Logger
class 你应该把代码移到 init
到构造函数中的适当位置。
Jonno_FTW 关于将 Logger 作为参数传递给构造函数也有一个好处。如果您想将 MyThread 用作线程(请参阅 http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html),您还需要扩展 Thread
class 或实现 Runnable
。之后,您将能够使用 MyThread.start()
.