Java-приложение для группового чата с использованием потоков - PullRequest
0 голосов
/ 03 мая 2018

Мне было интересно, почему моя кнопка отправки в этом групповом чате не выводит сообщение, которое я хочу, в текстовую область, все компилируется и ошибок нет, поэтому я в растерянности, любая помощь будет оценили. Это мой первый пост здесь, поэтому, пожалуйста, простите за любые ошибки форматирования. Я приложил свой код ниже, любая помощь приветствуется, спасибо!

    package ChatGUI;

    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;


 public class preDisplay extends Thread{

    String username;
    public void run() {
    JFrame preFrame = new JFrame();
    JButton enterChat = new JButton("Enter Chat");
    JTextField chooseUserName = new JTextField("Enter desired username");
    preFrame.add(chooseUserName, BorderLayout.CENTER);
    chooseUserName.setBounds(15,20,250,50);

    enterChat.setBounds(80,80,120,40);  
    preFrame.add(enterChat);           
    preFrame.setSize(300,200); 
    preFrame.setLayout(null); 
    preFrame.setVisible(true);

    enterChat.addActionListener(new ActionListener()
    {
         public void actionPerformed(ActionEvent ae)
         { 
              username = chooseUserName.getText();
              preFrame.setVisible(false);

         }
    });

}

}

   package ChatGUI;

   import java.awt.BorderLayout;
   import java.awt.event.ActionEvent;
   import java.awt.event.ActionListener;
   import javax.swing.JButton;
   import javax.swing.JFrame;
   import javax.swing.JTextArea;
   import javax.swing.JTextField;

    public class SendMessageUI extends Thread{

    public void run() {

        JFrame frame = new JFrame();//create new frame
        JButton sendButton = new JButton("send");
        JTextField textField = new JTextField();
        frame.add(textField, BorderLayout.CENTER);
        textField.setBounds(15,20,250,50);

        DisplayMessages display = new DisplayMessages();
        preDisplay pre_disp = new preDisplay();

        sendButton.addActionListener(new ActionListener()
        {
             public void actionPerformed(ActionEvent ae)
             {
                  display.textArea.append(pre_disp.username + ": " + " " + textField.getText() + '\n');
             }
        });

        sendButton.setBounds(100,80,80,40);//x axis, y axis, width, height  
        frame.add(sendButton);//adding button in JFrame            
        frame.setSize(300,200);//300 width and 200 height  
        frame.setLayout(null);//using no layout managers  
        frame.setVisible(true);//show frame
}

}

    package ChatGUI;



    public class DisplayMessages extends Thread{

    JTextArea textArea = new JTextArea();

    public void run(){
    JFrame frame2 = new JFrame();//create new frame
    frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//set behavior when closed
    frame2.setSize(400,300);//400 width and 300 height  
    frame2.setLayout(null);//using no layout managers  
    frame2.setLocationRelativeTo(null);
    frame2.setVisible(true);//show frame

    textArea.setBounds(15,20,350,220);
    textArea.setEditable(false);
    frame2.add(textArea);
}

}

    package ChatGUI;

    public class Main {

public static void main(String[] args) {
    Thread t1 = new Thread(new preDisplay());
    Thread t2 = new Thread(new SendMessageUI());
    Thread t3 = new Thread(new DisplayMessages());

    t1.start();
    t2.start();
    t3.start();
}

}

1 Ответ

0 голосов
/ 03 мая 2018

Вы устанавливаете текст неправильного объекта DisplayMessages. Вы создаете новый неотображаемый и отправляете текст на него, в то время как отображаемый не получает отправленный текст. Вся проблема заключается в том, чтобы понять, что такое объект / ссылка Java, и установить состояние правильной ссылки, а не какой-то случайной ссылки, которая оказывается того же типа, что и интересующая.

Здесь:

public class SendMessageUI extends Thread{

public void run() {

    JFrame frame = new JFrame();//create new frame
    JButton sendButton = new JButton("send");
    JTextField textField = new JTextField();
    frame.add(textField, BorderLayout.CENTER);
    textField.setBounds(15,20,250,50);

    DisplayMessages display = new DisplayMessages();

Этот объект DisplayMessages не отображается для пользователя.

Вместо этого здесь:

public static void main(String[] args) {
    Thread t1 = new Thread(new preDisplay());
    Thread t2 = new Thread(new SendMessageUI());
    Thread t3 = new Thread(new DisplayMessages());  // ******

- это то, что действительно отображается.

Решение этой проблемы состоит в том, чтобы изучить, что в действительности представляет собой объект Java, что означает ссылка на объект, а затем передать истинный интересующий объект туда, где он необходим, чтобы его состояние при необходимости изменялось.

Существует множество не связанных между собой проблем, в том числе:

  • Игнорирование правил потоков Swing, включая создание и отображение графического интерфейса Swing и изменение их состояния off потока событий Swing. Вы можете прочитать Урок: Параллельность в Swing , чтобы узнать, как правильно обрабатывать потоки Swing
  • Расширение Thread, а не реализация Runnable или Callable
  • Использование нулевых макетов и абсолютного позиционирования
...