如何在Java中使用与其他元素相同的actionListener

时间:2016-10-03 15:11:09

标签: java multithreading actionlistener runnable printwriter

我在聊天应用中工作。在这个应用程序中,我有一个JTxtField txtMessage,当用户按Enter键时会发送消息。我想添加一个JButton btn_send来做同样的事情,但是如果我添加btn_send.addActionListener(enviar_mensaje),那么在我按下JTextField中的Enter之前,该方法不会执行任何操作。

如何将JTxtFieldJButton用于同一方法?

public void write(){
    Thread writeThread = new Thread(new Runnable(){
        public void run(){
            try{
                writer = new PrintWriter(socket.getOutputStream(),true);
                txtMessage.addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent e){
                        String sendMessage = txtMessage.getText();
                        writer.println(sendMessage);
                        txtMessage.setText("");
                        chatArea.append("Server say: "+sendMessage+"\n");
                        btnClean.addActionListener(new ActionListener(){
                            public void actionPerformed(ActionEvent e){
                                  chatArea.setText("");
                            }
                        });
                    }
                });
            }catch(Exception ex){
                ex.printStackTrace();
            }       
        }
    });
    writeThread.start();
}

2 个答案:

答案 0 :(得分:1)

ActionListeners的想法是他们收到一些ActionEvent e。

因此,当您想要将同一个侦听器附加到多个对象时,例如:

ActionListener a1 = ... 

button.addActionListener(a1);
textField.addActionListener(a1);

然后,当然,您的ActionListener应检查 e 以了解调用它的上下文。

然后:如果您使用的是Java8,可以使用方法引用来提供ActionListeners;请参阅here了解如何做到这一点的非常好的例子!

答案 1 :(得分:0)

我终于可以解决困扰我的问题,我必须采用write()中的方法,然后从ActionListener中调用它们。谢谢大家!!

public void sendMessage(){

    String message = txtMessage.getText();

    writer.println(message);

    txtMessage.setText("");

    chatArea.append("Server says: "+message+"\n");

}


public void clean(){

    chatArea.setText("");

}


public void write(){

Thread message = new Thread(new Runnable(){

    public void run(){

        try{

            writer = new PrintWriter(socket.getOutputStream(),true);



            txtMessage.addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e){

                    sendMessage();

                }

            });



            sendBtn.addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e){

                    sendMessage();

                }

            });



            cleanBtn.addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e){

                    clean();

                }

            });



        }catch(Exception ex){

            ex.printStackTrace();

        }

    }

});

message.start();

}