, когда метод 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();
}
Google «Java JFrame freezing» и найти все повторяющиеся вопросы. Решение одно и то же - используйте фоновые потоки. Хорошая вещь, чтобы сделать такой поиск * прежде чем задавать вопрос, который был задан * много раз раньше. –