Java 从控制台到GUI获取应用程序
我正在学习用Java编写代码。我想用gui编写简单的聊天。到目前为止,我的应用程序通过命令行运行。我有兴趣建立gui到客户端部分。我很难连接到它。我的问题是,我是否必须为gui编写特殊的类,然后在客户机类中构造这样一个对象并对其进行操作?特别是,我在通过gui在客户机和服务器之间建立通信方面遇到了问题。客户端部分的命令行应用程序代码如下所示。如果您能就此事提供任何建议,我将不胜感激Java 从控制台到GUI获取应用程序,java,user-interface,client-server,Java,User Interface,Client Server,我正在学习用Java编写代码。我想用gui编写简单的聊天。到目前为止,我的应用程序通过命令行运行。我有兴趣建立gui到客户端部分。我很难连接到它。我的问题是,我是否必须为gui编写特殊的类,然后在客户机类中构造这样一个对象并对其进行操作?特别是,我在通过gui在客户机和服务器之间建立通信方面遇到了问题。客户端部分的命令行应用程序代码如下所示。如果您能就此事提供任何建议,我将不胜感激 public class Client { public static void main(String[
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);
}
}
}
及
通常的做法是尽可能将逻辑与GUI分离。我将创建一个类(或多个类)来实现发送/接收消息部分(看起来您已经这样做了) 这些类应该提供发送/接收消息的公共方法,并且可能能够注册侦听器并通知它们传入的消息 然后编写一个GUI类,将其注册为服务器类的侦听器,并在发生
MessageReceived
事件后更新文本。可以找到事件处理基础知识,这是创建和处理自定义事件的示例
示例
//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);
}
}
通常的做法是尽可能将逻辑与GUI分离。我将创建一个类(或多个类)来实现发送/接收消息部分(看起来您已经这样做了) 这些类应该提供发送/接收消息的公共方法,并且可能能够注册侦听器并通知它们传入的消息 然后编写一个GUI类,将其注册为服务器类的侦听器,并在发生
MessageReceived
事件后更新文本。可以找到事件处理基础知识,这是创建和处理自定义事件的示例
示例
//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);
}
}
连接不应该取决于它是CLI还是GUI。我同意。但我的主要问题是如何将服务器响应从控制台引导到gui中的JTextField,以及更让我困惑的是——gui代码应该放在哪里——在单独的类中还是在client class.off-topic中。。使用属性保存服务器设置,如端口、url和其他。还可以使用属性保存异常消息。使用logger而不是System.out或System.err.Connectivity不应该取决于它是CLI还是GUI。我同意。但我的主要问题是如何将服务器响应从控制台引导到gui中的JTextField,以及更让我困惑的是——gui代码应该放在哪里——在单独的类中还是在client class.off-topic中。。使用属性保存服务器设置,如端口、url和其他。还可以使用属性保存异常消息。并使用记录器,而不是System.out或System.err。
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();
}
}