gpt4 book ai didi

java - 将应用程序从控制台获取到 GUI

转载 作者:行者123 更新时间:2023-12-02 00:05:15 25 4
gpt4 key购买 nike

我正在学习用 Java 编写代码。我想用gui写简单的聊天。到目前为止,我的应用程序通过命令行运行。我有兴趣为客户端部分建立图形用户界面。我在连接 gui 时遇到问题。我的问题是我是否必须为 gui 编写特殊的类,然后在客户端类中构造这样的对象并对其进行操作?特别是我在通过 gui 建立客户端和服务器之间的通信时遇到问题。我的客户端部分的命令行应用程序代码如下。如果您对此事有任何建议,我将不胜感激。

public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 4444);
System.out.println("CLIENT: Server connected on port 4444");

PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("CLIENT: IN and OUT streams opened. Starting sending data...");

ClientInputThread thread = new ClientInputThread(socket);
thread.start();

String serverResponse;
while ((serverResponse = in.readLine()) != null) {
System.out.println("Server: " + serverResponse);
if (serverResponse.equals("koniec")) {
break;
}
}
System.out.println("CLIENT: Ending server connection. Closing client streams and socket.");
out.close();
in.close();
socket.close();
System.exit(0);
}
catch (UnknownHostException e) {
System.err.println("CLIENT: Trying to connect to unknown host: " + e);
System.exit(1);
}
catch (Exception e) {
System.err.println("CLIENT: Exception: " + e);
System.exit(1);
}
}
}

public class ClientInputThread extends Thread {
private PrintWriter out;

public ClientInputThread(Socket clientSocket) {
try {
out = new PrintWriter(clientSocket.getOutputStream(), true);
}
catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
}

public void run() {
try {
BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
String userInput="";
while (userInput != null) {
userInput = console.readLine();
out.println(userInput);
out.flush();
if (userInput.equals("koniec")) {
break;
}
}
System.exit(0);
}
catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
}
}

最佳答案

通常的做法是尽可能将逻辑与 GUI 分开。我将创建一个类(或多个类)来实现发送/接收消息部分(看起来您已经完成了)。

这些类应该提供公共(public)方法来发送/接收消息,并且可能能够注册监听器并通知它们传入的消息。

然后编写一个 GUI 类,将其注册为服务器类的监听器,并在发生 MessageReceived 事件后更新文本。事件处理基础知识可以找到 herehere是创建和处理自定义事件的示例。

示例

//an interface that will let your server work with its listeners
interface MessageListener {
public void messageSent();
}


class Server {
List<MessageListener> listeners = new ArrayList<MessageListener>();

//method to register listeners to be notified of incoming messages
public void addListener(MessageListener toAdd) {
listeners.add(toAdd);
}

public void sendMessage() {
//code your logic here
System.out.println("Message sent");

// Notify everybody that may be interested.
for (MessageListener hl : listeners)
hl.messageSent();
}

}

class GuiImplementation implements MessageListener {
@Override
public void messageSent() {
System.out.println(message);
}
}

和主类:

class Test {
public static void main(String[] args) {
Server server = new Initiater();
GuiImplementation gui = new Responder();

//register gui as a listener for incoming/outgoing messages
server.addListener(gui);

//this will trigger the gui method to process incoming message
server.sendMessage();
}
}

关于java - 将应用程序从控制台获取到 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14022213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com