Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JFrame未正确加载_Java_Swing_Sockets_Jframe_Event Dispatch Thread - Fatal编程技术网

Java JFrame未正确加载

Java JFrame未正确加载,java,swing,sockets,jframe,event-dispatch-thread,Java,Swing,Sockets,Jframe,Event Dispatch Thread,我正在编写一个网络游戏客户端,在点击按钮时在帧之间切换时遇到问题 我已经在不同的框架中编写了客户机的每个页面,当从客户机主页单击菜单按钮时,应该显示这些框架 以下是我所做的代码 public class homePage extends JFrame{ public homePage () { initComponents(); } private void initComponents(){ // the frame and b

我正在编写一个网络游戏客户端,在点击按钮时在帧之间切换时遇到问题

我已经在不同的框架中编写了客户机的每个页面,当从客户机主页单击菜单按钮时,应该显示这些框架

以下是我所做的代码

public class homePage extends JFrame{
       public homePage () {
       initComponents();
      }

      private void initComponents(){
      // the frame and butttons are here....


      GameListBtn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            this.setVisible(false); // to hide the current home page
            new GameList().start(); // to start new frame called GameList
            // basically the same thing as following code
            // GameList gl = new GameList();
            // gl.setVisible (true);
            // gl.run();
        }
      }
}


下面这个类只是运行GameList框架,它的连接来自一个主方法

   public static void main(String[] args) {
    new GameList().start();
    // basically the same thing as following code
    // GameList gl = new GameList();
    // gl.setVisible (true);
    // gl.run();
    }

当我从main方法运行游戏列表框架时,它可以正常工作。显示GUI,建立连接,数据传输成功。 我主要想做的是从主页的ActionListener调用新的GameList().start()方法,因为我可以从main方法调用它,显示GameList并隐藏主页

当我这样做时,正如我在第一段代码中所示,GameList的GUI没有加载(只是变黑了),但连接已经建立,数据传输成功。 GUI仅在连接终止时显示。我怀疑原因是GameList的run()方法中的while循环

但同样,当我从游戏列表类的main运行它时,完全相同的东西就像一个符咒。有人能告诉我为什么当我从主页调用gui时它没有加载,尽管我所做的一切都完全相同


如果我的问题听起来很愚蠢,很抱歉,但是如果您有任何帮助,我们将不胜感激。

当您从
ActionListener
调用
GameList.start()
时,您将处于,即线程正在Swing过程中处理每一个事件,例如鼠标或键盘输入,以及组件重新绘制。当您在Swing EDT中执行一个长进程时,实际上是在阻塞线程,并阻止处理任何其他事件,其中包括重绘事件。这就是为什么您的框架是黑色的,GUI似乎没有加载。当您从main方法调用它时,不会发生这种情况,因为您不在EDT线程中,而是在应用程序的主线程中

要解决这个问题,您应该使用
thread.start()
Runnable
从另一个线程调用GameList的run()方法

一个很好的经验法则是,为了保持应用程序的响应性,您不应该在事件中添加任何GUI内容和一些标志,也不应该在事件中进行任何计算


另一条规则是,为了避免一般问题,您应该将所有GUI内容(包括框架的创建)放在线程EDT中。如果您需要从另一个线程执行某些操作(如果您没有响应某个事件或您的线程在main方法中),请使用
SwingUtilities。invokeLater

如果可以,请避免使用多个帧,它们可能会让用户感到困惑,并简单地给屏幕添加混乱。在可能的情况下,请使用
CardLayout
JDesktopPane
JTabbedPane
而不是headyep。试着想象一下你玩了多少游戏,这些游戏向你扔了一堆窗户,。。。我打赌不会太多,看到了吗
   public static void main(String[] args) {
    new GameList().start();
    // basically the same thing as following code
    // GameList gl = new GameList();
    // gl.setVisible (true);
    // gl.run();
    }