首页 > 解决方案 > 带有 UI 的服务器客户端,UI 上的标签未使用方法更新

问题描述

所以我正在尝试用 UI 做一个客户端-服务器-项目。服务器有一个倒计时,并时不时地向客户端发送一个“唤醒”(Dead Mens Switch)。我已经设置了 UI,按钮工作等。

问题是,发送唤醒信号时我无法在 UI 上显示。

我的代码所做的是,如果接收到的消息等于“Wake Up”,它会在接口中调用一个 wakeUp()-Method。

我尝试过的事情:

void wakeUp(){
        wakeUpLabel.setText("Wake up!");
    }

我想我需要某种动作监听器,所以我创建了一个带有动作监听器的不可见按钮,并在调用该方法时对按钮进行了(虚拟)单击:

button1.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            wakeUpLabel.setText("Wake up!");
        }
    });

void wakeUp(){
            System.out.println("wakeUpMethod");
            button1.doClick();
        }

我不明白的是:如果我将 System.out.println("ActionPerformed") 放在 ActionPerformed 中,我会在控制台中获得输出,但标签不会改变。如果我在按钮上单击自己,则标签正在正确更新。

如何在不点击任何内容的情况下更新标签?

标签: javaswingjlabel

解决方案


据我所知,没有理由触发点击假按钮来更新 GUI,除了你的方法之外,它只会运行一些无用的繁重代码。

取而代之的是,只需使用 SwingUtilities.invokeLater() 在可运行块中调用更新语句......尝试这样的事情:

void wakeUp(){
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            wakeUpLabel.setText("Wake up!");
        }
    });
}

调用 wakeUp 方法时,如果标签已初始化且可见,这应该可以解决问题。

如果这不起作用,您可以尝试在可运行文件中添加wakeUpLabel.revalidate()和/或wakeUpLabel.repaint()

如果您仍然遇到问题,请在此处放置一个更完整的示例以帮助重现问题;)


推荐阅读