2016-10-03 15 views
1

Я работаю в чат-приложении. В этом приложении у меня есть JTxtField txtMessage, который отправляет сообщение, когда пользователь нажимает Enter. Я хочу добавить JButton btn_send, который делает то же самое, но если я добавлю btn_send.addActionListener(enviar_mensaje), метод ничего не сделает, пока я не нажимаю Enter в JTextField.Как использовать тот же actionListener, что и другой элемент в Java

Как использовать JTxtField и JButton для того же метода?

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(); 
} 
+0

Вы добавляете прослушиватель действий внутри 'actionPerformed'? Это не хорошо. Подготовьте слушателей действий перед потоком (я не знаю, для чего это). – user1803551

+0

И подсказка: основной язык здесь ** Английский **. Это верно и для кода; поэтому вместо прямого вставки исходного кода подумайте о создании минимально жизнеспособного примера, в котором используются английские термины. Помогает, чтобы получить хорошие ответы. И: under_bares не идут в именах Java, вы ** ** ** используете их только в SOME_CONSTANT. – GhostCat

+0

@ user1803551 Я расскажу вам, когда я сделаю эти изменения. –

ответ

1

Идея ActionListeners заключается в том, что они получают некоторый ActionEvent e.

Итак, если вы хотите, чтобы прикрепить же слушателя к нескольким объектам, как в:

ActionListener a1 = ... 

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

тогда, конечно, ваш ActionListener должен проверить, что е для того, чтобы понять контекст, в котором он был называется.

Затем: если вы используете Java8, вы можете использовать ссылки , чтобы предоставить ActionListeners; см. here для действительно приятного примера, как это сделать!

+0

Это интересный ответ, я говорю вам, когда я отправляю изменения;) –

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(); 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^