我正在创建一个多线程客户端服务器程序。

有一个客户端登录JPanel,它通过将用户名和密码发送到服务器进行检查来对用户进行身份验证,如果正确,服务器将发送回客户端:“是”

if (UsernameandPasswordMatch.equals("Yes"))
  {
       String numofplayers = Utility.ReadFromServer();
       int numofplayer_int = Integer.parseInt(numofplayers);
       new GameTablePanel(numofplayer_int).start(numofplayer_int);

       //change to game table panel
   }


这是GameTablePanel类的启动方法

void start(int numofplayer_int)
    {
        JLayeredPane lpane = new JLayeredPane();
        lpane.setBounds(0, 0, 1200, 750);

        JPanel background = new WallPaper();
        //background.setBounds(0, 0, 1200, 750);
        background.setOpaque(true);

    GameTablePanel panel = new GameTablePanel(numofplayer_int); //called 2nd time
        //panel.setBounds(100, 100, 400, 400);
        panel.setBounds(0,0,1200,750);
        panel.setOpaque(false);

        lpane.add(background, new Integer(0), 0);
        lpane.add(panel, new Integer(1), 0);

        Utility.ChangeJLPanel(lpane);

    }


使用调试器,我意识到,一旦我进入start方法,构造函数便会立即被调用,而当到达


  GameTablePanel面板=新的GameTablePanel(numofplayer_int)


仅供参考:每当客户端连接到服务器时,我都会在服务器端创建一个新线程

我怎么只一次调用我的构造函数而不是两次

最佳答案

似乎您是两次明确地调用它,一次是从这里

new GameTablePanel(numofplayer_int).start(numofplayer_int);


并再次从GametablePanel的启动方法内部进行。那是你要的吗?我不熟悉您要尝试执行的操作,但是由于您的启动方法已经属于该面板,因此您也可以这样做:

void start(int numofplayer_int) {
        JLayeredPane lpane = new JLayeredPane();
        lpane.setBounds(0, 0, 1200, 750);

        JPanel background = new WallPaper();
        //background.setBounds(0, 0, 1200, 750);
        background.setOpaque(true);

        //this.setBounds(100, 100, 400, 400);
        this.setBounds(0,0,1200,750);
        this.setOpaque(false);

        lpane.add(background, new Integer(0), 0);
        lpane.add(this, new Integer(1), 0);

        Utility.ChangeJLPanel(lpane);
}

10-04 22:23