Как обрабатывать два разных события - PullRequest
0 голосов
/ 28 декабря 2011

Я создаю простой графический интерфейс чата, и я написал сервер и клиент GUI, и я могу отправить сообщение из клиентского интерфейса на сервер.

Моя проблема с получением сообщения от сервера на фрейме. Когда я использую бесконечный цикл, кадр заблокирован. Я не знаю, как я должен разделить эту вещь, чтобы любое сообщение отображалось на JTextArea. Мой вопрос: Есть ли способ разделить фрейм для обработки информации «отправить» и «получить» с сервера?

Мой графический интерфейс состоит из JTextField, JTextArea и JButton.

При нажатии JButton текст с JTextField отправляется на сервер:

String u = jTextField.getText(); 
out.writeUTF(u);

Но я не знаю, что мне следует сделать, чтобы получить JTextArea уменьшить все время поступления информации на:

msg = in.readUTF();
jta.append(msg + "\n");

//

Если поток является классом или компонентом в классе GUI, потому что я создал поток, все, кажется, работает, но массаж не включается jTextField. Я сделал поток, как на сервере, я сделал в том же файле, но не работает:

    class bacgroundTask extends Thread{
static String msg;
static JTextArea jta;
static DataInputStream in;
public void run(){
        while(true){
            try{
            msg = in.readUTF();
            jta.append(msg + "\n");
            }
            catch(IOException ioe){}}}}

//

Привет, это снова я, я пытаюсь использовать метод invokelater, но фрейм останавливается, когда выполняется, я не могу нажать кнопку отправки или ввести текст в jtextfield. Может ли какой-нибудь орган объяснить мне немного больше об этих методах, и они правы в моем случае.

Я пытался с и без stetment.

       SwingUtilities.invokeLater(
        new Runnable(){
            public void run(){
                while(true){
                try{
                    msg = in.readUTF();
                    jta.append(msg + "\n");
                    jta.revalidate();
                }
                catch(IOException ioe){

                }}}});

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

Не следует обновлять компоненты графического интерфейса в фоновом потоке.Попробуйте использовать SwingUtilities.invokeLater, и не забудьте использовать что-то вроде revalidate () в вашей текстовой области.

1 голос
/ 28 декабря 2011

Вам нужно запустить бесконечный цикл приема в фоновом потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...