Java - invokeLater не будет работать

1

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

Хотя, я не получаю такого же результата. Здесь код:


public class Server extends JFrame{
    private JTextField userText;
    private JTextArea chatWindow;
    private ObjectOutputStream output;
    private ObjectInputStream input; 
    private ServerSocket server;
    private Socket connection;

    //constructor
    public Server(){
        super("Coffee Messenger");
        userText = new JTextField();
        userText.setEditable(false);
        userText.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent event){
                    sendMessage(event.getActionCommand());
                    userText.setText("");
                }
            }
        );
        add(userText, BorderLayout.SOUTH);
        chatWindow = new JTextArea();
        add(new JScrollPane());
        setSize(300,150);
        setVisible(true);   
    }
    //set up and run the server
    public void startRunning(){
        try{
            server = new ServerSocket(6789, 100);
            while(true){
                try{
                    //connect and have conversation
                    waitForConnection();
                    setupStreams();
                    whileChatting();
                }catch(EOFException eofException){
                    showMessage("\n Server ended the connection!");
                }finally{
                    closeCrap();
                }
            }
        }catch(IOException ioException){
            ioException.printStackTrace();
        }
    }
    //wait for connection, then display connection information
    private void waitForConnection() throws IOException{
        showMessage("Waiting for someone to connect...\n");
        connection = server.accept();
        showMessage("Now connected to " + connection.getInetAddress().getHostName());
    }
    //get stream to send and receive data
    private void setupStreams() throws IOException{
        output = new ObjectOutputStream(connection.getOutputStream());
        output.flush();
        input = new ObjectInputStream(connection.getInputStream());
        showMessage("\n Streams are now setup! \n");
    }
    //during the chat conversation
    private void whileChatting() throws IOException{
        String message = "You are now connected!";
        sendMessage(message);
        ableToType(true);
        do{
            //have conversation
            try{
                message = (String) input.readObject();
                showMessage("\n " + message);
            }catch(ClassNotFoundException classNotFoundException){
                showMessage("\n idk wtf that user sent");
            }
        }while(!message.equals("CLIENT - END"));
    }
    //close streams and sockets (application)
    private void closeCrap(){
        showMessage("\n Closing connections...\n");
        ableToType(false);
        try{
            output.close();
            input.close();
            connection.close();
        }catch(IOException ioException){
            ioException.printStackTrace();
        }
    }
    //send message to client
    private void sendMessage(String message){
        try{
            output.writeObject("SERVER - " + message);
            output.flush();
            showMessage("\nSERVER - " + message);

        }catch(IOException ioException){
            chatWindow.append("\n ERROR: Cannot send message.");
        }
    }
    //updates chatWindow 
    private void showMessage(final String text){
        SwingUtilities.invokeLater(
            new Runnable(){
                public void run(){
                    chatWindow.append(text);
                }
            }
        );
    }
    //sets the ability to edit the textfield
    private void ableToType(final boolean tof){
        SwingUtilities.invokeLater(
            new Runnable(){
                public void run(){
                    userText.setEditable(tof);
                }
            }
        );
    }
}
__

Когда я запускаю приложение из моего основного метода, строка "Ожидание кого-то подключиться" (из метода waitForConnection) не отображается. Я считаю, что проблема заключается в методе showMessage. Я использую это неправильно? Если я заменил метод invokeLater на простой system.out.println(); проект выполняется точно так же, как и планировалось.

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

(кредиты thenewboston для создания этих руководств)

  • 0
    Где твой основной метод?
  • 1
    И почему вы не добавляете JWextArea из ChatWindow в JScrollPane? Ваш графический интерфейс, кажется, отображает пустую JScrollPane без причины. Не было бы лучше, если бы у вас было, add(new JScrollPane(chatWindow)); ? Я сделаю это ответ, так как это ключевая проблема.
Показать ещё 1 комментарий
Теги:
swing

1 ответ

2
Лучший ответ

Вот:

chatWindow = new JTextArea();
add(new JScrollPane());

ваш графический интерфейс создает JTextArea, chatWindow, но добавляет его ни к чему, что отображает его, а вместо этого ваш графический интерфейс отображает пустой JScrollPane. Было бы намного лучше, если бы у вас было,

chatWindow = new JTextArea();
add(new JScrollPane(chatWindow));

Таким образом, текст, отправленный в JTextArea, может отображаться.

  • 0
    Большое спасибо, наверное, я пропустил эту часть. Действительно ценю это!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню