【问题标题】:Java GUI group chat app using threads使用线程的 Java GUI 群聊应用程序
【发布时间】:2018-05-03 00:42:09
【问题描述】:

我想知道为什么我在这个 gui 群聊中的发送按钮没有将我想要的消息打印到预期的文本区域,一切都编译并且没有错误,所以我有点不知所措,任何帮助都会赞赏。这是我在这里的第一篇文章,所以请原谅任何格式错误。我在下面附上了我的代码,感谢您的任何帮助,谢谢!

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

}

【问题讨论】:

  • ????拜托,拜托,请阅读Concurrency in Swing - Swing 是 NOT 线程安全的,您不应该从外部修改 UI 的任何方面事件调度线程的上下文。您还可以通过对“模型-视图-控制器”之类的东西进行一些研究来帮自己一个大忙
  • 好的,谢谢,我会的

标签: java multithreading user-interface


【解决方案1】:

您设置了错误的 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 GUI 以及更改 Swing 事件线程的状态关闭。您需要阅读 Lesson: Concurrency in Swing 以了解如何正确处理 Swing 线程
  • 扩展线程而不是实现 Runnable 或 Callable
  • 使用空布局和绝对定位

【讨论】:

  • 好的,谢谢您的指导,我最近刚开始使用java,不知道如何正确引用对象,不确定初始线程、事件调度线程和工作线程的职责,以及如何正是它们的功能,我不知所措。
  • 无论如何你能指出我如何引用显示的对象的正确方法吗?或者提供可能有帮助的资源。自从开始 java 以来,引用对象一直是我的主要问题。
  • @KendallGarousi:说实话,我认为你本末倒置。首先学习基本的 Java OOPs 概念,这是这里的主要问题。只有在做完这些之后,才能学习更多Java的晦涩角落,例如GUI编码。
  • 好的,谢谢,我经常阅读这些概念并很好地理解基础知识,但是在应用和阐述它们时遇到了麻烦,可能只需要多练习。我知道摇摆中的并发性,但根据我对线程的非常有限的了解,我试图找到一个不需要它的解决方案。我现在应该知道我不能用这些东西走捷径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
相关资源
最近更新 更多