2016-05-20 3 views
-1

, когда метод newWaitScreen вызывается после того, как StartGameButtonListener называется JFrame, будет белым и «зависает», однако если вызывается newWaitScreen перед запуском StartGameButtonListener, он будет успешно показан. Кто-нибудь сможет мне помочь?JFrame становится пустым и «зависает»

Спасибо заранее и извините за беспорядок, это мой первый пост. Мой код выглядит следующим образом:

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

} 
+1

Google «Java JFrame freezing» и найти все повторяющиеся вопросы. Решение одно и то же - используйте фоновые потоки. Хорошая вещь, чтобы сделать такой поиск * прежде чем задавать вопрос, который был задан * много раз раньше. –

ответ

1

Вы используете поток пользовательского интерфейса для прослушивания соединений на своем сервере. Вам нужно создать новую Thread для обработки этого