java多线程jframe_java – 使用线程循环来更新JFrame

这篇博客探讨了在Java Swing应用中如何正确地在后台线程上执行循环并实时更新GUI。作者遇到的问题是,尽管在单独的线程上运行循环,但文本框只在循环完成后才更新。解决方案涉及使用`EventQueue.invokeLater()`来在事件调度线程中安全地更新UI。通过这样做,每次循环迭代时,文本框都能得到及时更新,同时允许用户通过停止按钮中断循环。
摘要由CSDN通过智能技术生成

我已经做了一些关于在循环中使用线程的广泛搜索,虽然我理解了单独的线程如何工作的概念,但我仍然无法掌握如何在我的简单应用程序中实现它.

我的应用程序包含一个带有文本框的表单.这个文本框需要在循环迭代后更新一次.它从按下按钮开始,但循环也应该按下一个停止按钮完成.我使用了一个布尔值来跟踪它是否被按下.

这是我的表单代码:

package threadtester;

public class MainForm extends javax.swing.JFrame {

public MainForm() {

initComponents();

}

private void RunButtonActionPerformed(java.awt.event.ActionEvent evt) {

ThreadTester.setRunnable(true);

ThreadTester example = new ThreadTester(2,this);

example.run();

}

private void StopButtonActionPerformed(java.awt.event.ActionEvent evt) {

ThreadTester.setRunnable(false);

}

public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new MainForm().setVisible(true);

}

});

}

public void setTextBox(String myString){

MainTextbox.setText(myString);

}

}

如你所见,我有一个按下的按钮.按下按钮时,执行名为ThreadTester的其他类中的代码.这是该类的代码:

package threadtester;

import java.util.logging.Level;

import java.util.logging.Logger;

public class ThreadTester implements Runnable

{

int thisThread;

MainForm myMainForm;

private static boolean runnable;

// constructor

public ThreadTester (int number,MainForm mainForm)

{

thisThread = number;

myMainForm = mainForm;

}

public void run ()

{

for (int i =0;i< 20; i++) {

if(runnable==false){

break;

}

System.out.println("I'm in thread " + thisThread + " line " + i);

myMainForm.setTextBox(i + "counter");

try {

Thread.sleep(1000);

} catch (InterruptedException ex) {

Logger.getLogger(ThreadTester.class.getName()).log(Level.SEVERE, null, ex);

}

} }

public static void setRunnable(Boolean myValue){

runnable = myValue;

}

public static void main(String[] args) {

MainForm.main(args);

}

}

正如您所看到的,循环已在单独的线程上创建…但文本框仅在循环结束后更新.现在我在我的MainForm中意识到我创建了一个单独的线程来运行循环,所以我不明白它为什么不运行?任何指导都将非常感激,我已经尝试在堆栈交换上查看示例但我似乎无法让它们适合我的实现.

根据Tassos建议的推荐,我的run方法现在看起来像这样:

public void run ()

{

for (int i =0;i< 20; i++) {

if(runnable==false){

break;

}

System.out.println("I'm in thread " + thisThread + " line " + i);

final String var = i + "counter";

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

myMainForm.setTextBox(var);

}

});

try {

Thread.sleep(1000);

} catch (InterruptedException ex) {

Logger.getLogger(ThreadTester.class.getName()).log(Level.SEVERE, null, ex);

}

} }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值