java – 使用线程循环来更新JFrame
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 使用线程循环来更新JFrame,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2847字,纯文字阅读大概需要5分钟。
内容图文
![java – 使用线程循环来更新JFrame](/upload/InfoBanner/zyjiaocheng/753/42aaf74abaa74da2a743f765150b027c.jpg)
我已经做了一些关于在循环中使用线程的广泛搜索,虽然我理解了单独的线程如何工作的概念,但我仍然无法掌握如何在我的简单应用程序中实现它.
我的应用程序包含一个带有文本框的表单.这个文本框需要在循环迭代后更新一次.它从按下按钮开始,但循环也应该按下一个停止按钮完成.我使用了一个布尔值来跟踪它是否被按下.
这是我的表单代码:
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);
}
} }
解决方法:
为了让Tassos的回答起作用,你实际上必须创建一个你没有做过的新线程.只是打电话
ThreadTester example = new ThreadTester(2,this);
example.run();
仅仅从EDT调用run方法的sice是不够的.您需要执行以下操作:
Thread t = new Thread(new ThreadTester(2,this));
t.start();
请参考Defining and Starting a Thread.
此外,您希望从两个不同的线程(runnable)修改相同的字段,这是一个错误.您应该阅读有关java并发的更多信息.
内容总结
以上是互联网集市为您收集整理的java – 使用线程循环来更新JFrame全部内容,希望文章能够帮你解决java – 使用线程循环来更新JFrame所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。