在参考Multiplayer Java game - program freeze when starting Server via GUI时,我使用了runnable并创建了一个线程来解决我遇到的问题。
我现在正在更新JLabel和JTextField但是仅使用setText()不能完成这项工作。我相信这是由于线程。我已阅读了一些帖子,并了解我应该使用SwingUtilities.invokeLater来更新UI。
以下是我需要做的事情并尝试过:
1)ServerFrame(要更新的UI JLabel和JTextField)。它具有以下方法来进行更新。我在这里需要SwingUtilities.invokeLater吗?
public static void setStatus (final String status) {
System.out.println("set status from Fishing connect server frame: " + status);
player1.setText(status);
player1.repaint();
}
2)服务器(这是我的游戏服务器,我有一个方法可以在第1项中调用setStatus进行更新)和SwingUtilities.invokeLater。
public static void setStatus (final String status) {
SwingUtilities.invokeLater(new Runnable() {
public void run()
{
FishingGameServerFrame.setStatus(status);
}
});
}
3)第1项对象是通过GameConnectServerFrame
中的可运行线程启动的start.addActionListener (new ActionListener() {
public void actionPerformed (ActionEvent event) {
DEFAULT_PORT = Integer.parseInt(port.getText());
Runnable r = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
fgServer.run();
fgServerFrame = new FishingGameServerFrame();
}
};
new Thread(r).start();
frame.setVisible(false);
}
});
上述代码没有任何编译错误,但UI仍未更新。 我可以知道哪个更适合使用SwingUtilities.invokeLater吗?项目1或2?或者我做错了什么?