java - 带有 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 中,我会在控制台中获得输出,但标签不会改变。如果我在按钮上单击自己,则标签正在正确更新。
如何在不点击任何内容的情况下更新标签?
解决方案
据我所知,没有理由触发点击假按钮来更新 GUI,除了你的方法之外,它只会运行一些无用的繁重代码。
取而代之的是,只需使用 SwingUtilities.invokeLater() 在可运行块中调用更新语句......尝试这样的事情:
void wakeUp(){
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
wakeUpLabel.setText("Wake up!");
}
});
}
调用 wakeUp 方法时,如果标签已初始化且可见,这应该可以解决问题。
如果这不起作用,您可以尝试在可运行文件中添加wakeUpLabel.revalidate()
和/或wakeUpLabel.repaint()
。
如果您仍然遇到问题,请在此处放置一个更完整的示例以帮助重现问题;)
推荐阅读
- node.js - 是否可以将一种方法放入 nodejs 中的另一个文件并表达?
- java-8 - 为什么在Consumer功能接口中使用andThen?
- python-3.x - 如何为python字典使用if else条件?
- android - 如果指纹不起作用,如何设置回退方法
- javascript - Javascript拖放交换:一种填补空白的方法
- reactjs - ReactJS:React CountUp 在可见性传感器中仅可见一次
- javascript - 如何使标签同时适用于输入和输出
- python - if 语句对某些输入行为不端
- authentication - 如何使用 asp.net core api 在其标头中授权带有 x-auth-token 的请求?
- android-studio - 在android studio的exoplayer中添加特定时间显示弹出框