Java JFrame变为空白并且;“挂起”;

Java JFrame变为空白并且;“挂起”;,java,swing,user-interface,jframe,Java,Swing,User Interface,Jframe,当在调用StartGameButtonListener之后调用newWaitScreen方法时,JFrame将为白色且“挂起”,但是如果在StartGameButtonListener之前调用newWaitScreen,则会成功显示。有人能帮我吗 提前谢谢你,很抱歉弄得一团糟,这是我第一次发帖。我的代码如下: public void serverMenu () { frame = new JFrame ("Game Server"); frame.setDefaultClose

当在调用StartGameButtonListener之后调用newWaitScreen方法时,JFrame将为白色且“挂起”,但是如果在StartGameButtonListener之前调用newWaitScreen,则会成功显示。有人能帮我吗

提前谢谢你,很抱歉弄得一团糟,这是我第一次发帖。我的代码如下:

public void serverMenu () 
{
    frame = new JFrame ("Game Server");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    String [] noOfPlayer = {"1", "2", "3"};

    JPanel panel = new JPanel (); 

    JLabel port = new JLabel ("Port");
    portNo = new JTextField (15);

    JLabel players = new JLabel ("No. of Player(s):");
    playerNo = new JComboBox (noOfPlayer);

    JButton startGame = new JButton ("Start Game Server");
    startGame.addActionListener (new StartGameButtonListener());

    panel.add (port);
    panel.add (portNo);
    panel.add (players); 
    panel.add (playerNo); 
    panel.add (startGame);

    frame.add (panel); 
    frame.setPreferredSize (new Dimension (275,200));
    frame.pack (); 
    frame.setVisible (true); 
    //newWaitScreen (444, 2);  //if newWaitScreen is called here, the screen will be shown with no issue

}

private class StartGameButtonListener implements ActionListener 
{
    public void actionPerformed (ActionEvent e) 
    {
        String portNum = portNo.getText(); 

        String playerNum = (String) playerNo.getSelectedItem(); 

        startGameCallBack (portNum, playerNum);
    }
}

public void startGameCallBack (String portNum, String playerNum)
{
    frame.setVisible (false); 

    int port ; 
    int noPlayer; 

    port = Integer.parseInt (portNum); 

    noPlayer = Integer.parseInt (playerNum);

    waitGame (port, noPlayer); 
}

public void waitGame (int portNum, int noOfPlayer)
{ 
    newWaitScreen (portNum, noOfPlayer);  //if newWaitScreen called JFrame becomes white and "hang"

    ServerSocket serverSocket = null; 

    try 
    {
        serverSocket = new ServerSocket (portNum);
    }

    catch (IOException e)
    {
        System.out.println ("Port " + portNum +" not avaliable");
        System.exit (0); 
    }

    for (int i = 1 ; i <= noOfPlayer; i++)
    {
        Socket clientSocket = null; 

        try 
        {
            System.out.println ("Waiting for client connection");
            clientSocket = serverSocket.accept(); 
            System.out.println ("Client connected");
        }

        catch (IOException e)
        {
            System.out.println ("Client unable to connect");
            System.exit (0); 
        }

        System.out.println (i);


        /*ClientHandler c = new ClientHandler (clientSocket, serverCounter); 
        serverCounter++;

        if (serverCounter >= noOfPlayer)
            break;*/
    }
}

public void newWaitScreen (int portNum, int noOfPlayer)
{
    frame = new JFrame ("Game Server");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    bigPanel = new JPanel ();
    bigPanel.setPreferredSize (new Dimension (200, 300));

    JLabel label = new JLabel ("Listening to port: " + portNum);
    JPanel portLabel = new JPanel ();
    portLabel.add (label);
    bigPanel.add (portLabel); 

    JPanel panel1 = new JPanel (); 
    panel1.setPreferredSize (new Dimension (200, 30));

    player1 = new JLabel ("Player 1");
    connection1 = new JLabel ("Waiting for connection...");
    panel1.add (player1);
    panel1.add (connection1);
    bigPanel.add (panel1); 

    if (noOfPlayer > 1)
    {
        player2 = new JLabel ("Player 2");
        connection2 = new JLabel ("Waiting for connection...");

        JPanel panel2 = new JPanel (); 
        panel2.setPreferredSize (new Dimension (200, 30));
        panel2.add (player2);
        panel2.add (connection2); 

        bigPanel.add (panel2); 
    }

    if (noOfPlayer > 2)
    {
        player3 = new JLabel ("Player 3");
        connection3 = new JLabel ("Waiting for connection...");
        JPanel panel3 = new JPanel (); 
        panel3.setPreferredSize (new Dimension (200, 30));
        panel3.add (player3);
        panel3.add (connection3); 

        bigPanel.add (panel3); 
    }

   frame.add (bigPanel);
   bigPanel.setVisible (true); 

   frame.setPreferredSize (new Dimension (275,300));
   frame.pack(); 
   frame.setVisible (true); 

   frame.repaint(); 
   frame.revalidate(); 

}
public void服务器菜单()
{
frame=新的JFrame(“游戏服务器”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
字符串[]noOfPlayer={“1”、“2”、“3”};
JPanel面板=新的JPanel();
JLabel端口=新的JLabel(“端口”);
portNo=新的JTextField(15);
JLabel玩家=新的JLabel(“玩家数量:”);
playerNo=新的JComboBox(noOfPlayer);
JButton startGame=新JButton(“启动游戏服务器”);
startGame.addActionListener(新的StartGameButtonListener());
panel.add(端口);
panel.add(端口号);
panel.add(玩家);
panel.add(playerNo);
panel.add(startGame);
frame.add(面板);
frame.setPreferredSize(新尺寸(275200));
frame.pack();
frame.setVisible(true);
//newWaitScreen(444,2);//如果在此处调用newWaitScreen,屏幕将显示为无问题
}
私有类StartGameButtonListener实现ActionListener
{
已执行的公共无效操作(操作事件e)
{
字符串portNum=portNo.getText();
字符串playerNum=(字符串)playerNo.getSelectedItem();
startGameCallBack(portNum,playerNum);
}
}
public void startGameCallBack(字符串端口号、字符串玩家号)
{
frame.setVisible(假);
国际港口;
整流罩;
port=Integer.parseInt(portNum);
noPlayer=Integer.parseInt(playerNum);
waitGame(端口、noPlayer);
}
公共void waitGame(int portNum,int noOfPlayer)
{ 
newWaitScreen(portNum,noOfPlayer);//如果名为JFrame的newWaitScreen变为白色并“挂起”
ServerSocket ServerSocket=null;
尝试
{
serverSocket=新的serverSocket(portNum);
}
捕获(IOE异常)
{
System.out.println(“端口”+portNum+“不可用”);
系统出口(0);
}
for(int i=1;i=noOfPlayer)
中断*/
}
}
公共void newWaitScreen(int-portNum,int-noOfPlayer)
{
frame=新的JFrame(“游戏服务器”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
bigPanel=newjpanel();
bigPanel.setPreferredSize(新尺寸(200300));
JLabel=newjlabel(“侦听端口:”+portNum);
JPanel-portLabel=newjpanel();
portLabel.add(标签);
bigPanel.add(端口标签);
JPanel panel1=新的JPanel();
面板1.setPreferredSize(新尺寸(200,30));
player1=新JLabel(“玩家1”);
connection1=新的JLabel(“等待连接…”);
面板1.add(播放器1);
面板1.add(连接1);
bigPanel.add(panel1);
如果(noOfPlayer>1)
{
player2=新JLabel(“玩家2”);
connection2=新的JLabel(“等待连接…”);
JPanel panel2=新的JPanel();
面板2.设置首选尺寸(新尺寸(200,30));
面板2.add(播放器2);
面板2.add(连接2);
bigPanel.add(panel2);
}
如果(noOfPlayer>2)
{
player3=新的JLabel(“player3”);
connection3=新的JLabel(“等待连接…”);
JPanel panel3=新的JPanel();
面板3.setPreferredSize(新尺寸(200,30));
面板3.add(播放器3);
面板3.add(连接3);
bigPanel.add(panel3);
}
frame.add(bigPanel);
bigPanel.setVisible(true);
frame.setPreferredSize(新尺寸(275300));
frame.pack();
frame.setVisible(true);
frame.repaint();
frame.revalidate();
}

您正在使用UI线程侦听ServerSocket上的连接。您需要创建一个新线程来处理此问题

Google
javajframe
,并找到所有重复的问题。解决方案是一样的——使用后台线程。在问一个以前被问过很多次的问题之前做这种搜索是件好事。