gpt4 book ai didi

java - 我的 JLabel 刷新速度不快。为什么?

转载 作者:行者123 更新时间:2023-12-01 16:54:44 25 4
gpt4 key购买 nike

我正在使用 vlcj 阅读媒体,我想在一些 JLabels 中显示已用时间和剩余时间。我写了一些代码,但似乎我的 JLabel.setText 每秒刷新次数不超过 2 次。

为了进行更多尝试并确保不是 vlcj 的线程会遇到一些麻烦,我用 JLabel 编写了一段代码。这个简单代码的目的是每秒更新 JLabel 10 次。

这是我的代码:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class TestLabel extends JFrame implements Runnable{
JLabel label = new JLabel("0");
int i=0;
TestLabel() {
this.setTitle("Test");
this.setSize(200, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setContentPane(label);
this.setVisible(true);
}

public static void main(String[] args) {
TestLabel tLabel = new TestLabel();
Thread t1 = new Thread(tLabel);
t1.start();
}

@Override
public void run() {
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
i+=1;
System.out.println(i);
label.setText(String.valueOf(i));
}
}, 0, 100, TimeUnit.MILLISECONDS);
}
}

结果:在控制台中,我得到 1, 2, 3, 4...但是在 JLabel 中,我得到类似:1, 2, 3 (...) 32, 37, 42, 47。似乎 System.out.println 写每个“i”,但 JLabel 不写。为什么我会有这个 Artifact ?

谢谢大家的回复。问候。

最佳答案

除了事件分派(dispatch)线程之外,您不得使用来自其他线程的 swing 组件。

所以,要么使用 Swing Timer而不是 ScheduledExecutorService,或者将标签更改包装到 SwingUtilities.invokeLater() 中。

顺便说一句,对 new TestLabel(); 的调用也应该包装到 SwingUtilities.invokeLater() 中。阅读swing concurrency tutorial .

关于java - 我的 JLabel 刷新速度不快。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34708132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com