Java JFrame变为空白并且;“挂起”;
当在调用StartGameButtonListener之后调用newWaitScreen方法时,JFrame将为白色且“挂起”,但是如果在StartGameButtonListener之前调用newWaitScreen,则会成功显示。有人能帮我吗 提前谢谢你,很抱歉弄得一团糟,这是我第一次发帖。我的代码如下: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
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上的连接。您需要创建一个新线程来处理此问题Googlejavajframe
,并找到所有重复的问题。解决方案是一样的——使用后台线程。在问一个以前被问过很多次的问题之前做这种搜索是件好事。