用于Java的Netty和GUI

我用服务器和客户端创建了一个简单的Netty应用程序,通过控制台进行交互。 现在我正在尝试添加GUI,以便客户端可以查看/并在控制台中输入他们的消息。

我认为在用于创建频道的同一个类中创建GUI是不明智的。

以下是我的主要客户端类的示例。

public void run() throws Exception { EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap bootstrap = new Bootstrap() .group(group) .channel(NioSocketChannel.class) .handler(new ChatClientInitializer()); Channel channel = bootstrap.connect(host, port).sync().channel(); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); while (true) { channel.writeAndFlush((in.readLine() + "\r\n")); } } finally { group.shutdownGracefully(); } } 

如何创建GUI,以便当用户在JTextField中输入消息时,它将被传递给channel.writeAndFlush方法?

我是否在.run方法中创建GUI的实例。

我的问题的第二部分,在我的处理程序类(下面的代码)中如何将传入的消息传递给我的GUI中的JTextArea

这是一个非常基本的Handler类的示例。

 protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { System.out.println(msg); } 

这里是我的GUI类供参考。

 public ClientGUI(){ enterField = new JTextField(); enterField.setEditable(true); enterField.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent event){ sendMessage(event.getActionCommand()); enterField.setText(""); } }); add(enterField,BorderLayout.NORTH); displayArea = new JTextArea(); add (new JScrollPane(displayArea), BorderLayout.CENTER); setSize(300,150); setVisible(true); } public void sendMessage(String message){ // what to do here? } 

ClientGUI类必须具有对Channel进行通信的引用。 假设你在某个地方也有对ClientGUI实例的引用,并且在初始化GUI之后创建了Channel ,你可以在ClientGUI添加一些setter:

 public class ClientGUI { private volatile Channel channel; public void setChannel(Channel channel) { this.channel = channel; } public void sentMessage(String msg) { channel.writeAndFlush(msg); } ... }