用于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); } ... }