空白的Java摇摆框架

时间:2014-02-22 16:34:54

标签: java multithreading swing concurrency

我是一名学生,正在尝试更多地了解Java开发,目前正在使用swing创建一个简单的客户端/服务器IM应用程序。

让我试着解释一下我遇到的问题:

  1. 类Login在启动时运行,在成功通过服务器验证后(工作正常),ClientChat类被实例化。

  2. ClientChat创建一个新的JFrame,与服务器建立新连接并创建新的I / O流。所有这些背景的东西工作正常,但新框架是完全空白的。

  3. 如果我在没有Login类的情况下运行应用程序(即直接运行ClientChat),则不会出现此问题。

  4. 目前尚未成功的方法:

    1. 使用frame.pack()。
    2. 使用frame.validate()。
    3. 将Login的JFrame传递给ClientChat,只需切换面板而不是创建新框架。
    4. 从登录():

          panel.add(userLabel);
          panel.add(passLabel);
          panel.add(userEntry);
          panel.add(passEntry);   
          panel.add(button);
      
          frame.add(panel, BorderLayout.NORTH);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setTitle("Chat Room Authentication");
          frame.setSize(300, 120);
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
      
          ...
      
          frame.setVisible(false);
          ClientChat clientChat = new ClientChat(serverIP);
          clientChat.start();
      

      来自ClientChat():

          userText = new JTextField();
          chatWindow = new JTextArea();
      
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
          frame.setTitle("Logged in as "+user.toUpperCase());
          frame.add(userText, BorderLayout.SOUTH);
          frame.add(new JScrollPane(chatWindow), BorderLayout.CENTER);    
          frame.setSize(300, 150);
          frame.setVisible(true);
      

1 个答案:

答案 0 :(得分:3)

您有一个经典的Swing线程问题,您可以在Swing的事件线程(也称为 E vent 上运行长时间运行的代码D ispatch T hread或 EDT ,通过这样做,您可以防止EDT执行绘制GUI并与之交互的必要任务用户。

解决方案:使用SwingWorker帮助您创建一个后台线程,该线程允许长时间进程不干扰Swing GUI,并允许它与GUI良好通信。

有关详情,请查看:Lesson: Concurrency in Swing