java - 将 JFrame 传递给新创建的类以从新类接收日志数据

标签 java swing

我真的很难在谷歌上找到我正在特别寻找的东西,甚至在不知道任何特殊单词的情况下正确解释它,对不起。我正在开发我的第一个 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);

    }

}

我还有一个用于启动服务器的主类。当启动主类时,应该启动一个记录器,然后我将它传递给一个新启动的线程。

我的主类

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构造函数,并调用log.logToLogger(receivedText);来自MyThread .

您的代码应如下所示:

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 上的 cmd 提示符下,运行 telnet 127.0.0.1 1234并输入您的消息,它应该出现在 JFrame 中假设您在端口 1234 上运行应用程序。

您可能应该扩展 run()方法比仅仅关闭接收到的线路更强大。

关于java - 将 JFrame 传递给新创建的类以从新类接收日志数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28291257/

相关文章:

java - 返回java中的匿名对象

java - 使用 ProcessBuilder 执行 Linux 命令并从 reader.readLine() 获取 NULL,尽管行数为 102

java - 我如何瘦身JBOSS?

java - 文本不会延迟更改

java - 如何让我的按钮切换而不循环?

java - 无法在 Hibernate Criteria 中获取两个日期之间的数据

java - 使用 JFrame 时出现字符串数组错误

java - 透明 JTextPane 中的插入符

java - KeyListener 在 JFrame 中随机工作

java为oracle VARCHAR2返回空字符串值