JLabel和JTextField未使用setText()更新

时间:2014-09-05 12:57:01

标签: java multithreading swing jlabel jtextfield

在参考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?或者我做错了什么?

0 个答案:

没有答案