gpt4 book ai didi

java - 在 JFrame 中使用线程

转载 作者:行者123 更新时间:2023-12-01 07:12:42 26 4
gpt4 key购买 nike

我有一个包含面板的主机。我希望在此面板中有一个线程,只要应用程序正在运行,它就会更改标签图像...

当我创建实现可运行的面板,然后在大型机中创建该面板的实例时,应用程序进入无限循环......我的代码如下:

public mainFrame()
{
BanerPanel baner = new BanerPanel();
baner.run();
}

public class Banner_Panel extends JPanel implements Runnable {

public Banner_Panel() {
initComponents();
imgPath = 2;
imgLbl = new JLabel(new ImageIcon(getClass().getResource("/Photos/banner_4-01.png")));
add(imgLbl);
//run();
}
@Override
public void run() {
while(true)
{
try {
while (true) {
Thread.sleep(3000);
switch(imgPath)
{
case 1:
imgLbl.setIcon(new ImageIcon(getClass().getResource("/Photos/banner_4-01.png")));
imgPath = 2;
break;
case 2:
imgLbl.setIcon(new ImageIcon(getClass().getResource("/Photos/banner_1-01.png")));
imgPath = 3;
break;
case 3:
imgLbl.setIcon(new ImageIcon(getClass().getResource("/Photos/banner_2-01.png")));
imgPath = 4;
break;
case 4:
imgLbl.setIcon(new ImageIcon(getClass().getResource("/Photos/banner_3-01.png")));
imgPath = 1;
break;
}

}
} catch (InterruptedException iex) {}
}
}

最佳答案

  • 请勿调用JLabel#setIcon(...)在后台线程中,因为必须在 Swing 事件线程或 EDT 上调用它。相反,为什么不简单地使用 Swing Timer 呢?
  • 此外,无需不断地从磁盘读取图像。相反,读取一次图像并将 ImageIcons 放入数组或 ArrayList<ImageIcon> 中只需迭代 Swing 计时器中的图标即可。
  • 当您调用 run() 时,您的代码实际上并不使用后台线程。直接在您的 Runnable 对象上,它根本不执行任何线程。请阅读threading tutorial了解如何使用 Runnables 和线程(提示您在线程上调用 start())。

例如

// LABEL_SWAP_TIMER_DELAY a constant int = 3000
javax.swing.Timer myTimer = new javax.swing.Timer(LABEL_SWAP_TIMER_DELAY,
new ActionListener(){
private int timerCounter = 0;

actionPerformed(ActionEvent e) {
// iconArray is an array of ImageIcons that holds your four icons.
imgLbl.setIcon(iconArray[timerCounter]);
timerCounter++;
timerCounter %= iconArray.length;
}
});
myTimer.start();

了解更多,请查看Swing Timer Tutorial .

关于java - 在 JFrame 中使用线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11301724/

26 4 0
文章推荐: jQuery 将