gpt4 book ai didi

java - 从线程更新 Swing GUI

转载 作者:行者123 更新时间:2023-12-01 12:22:17 24 4
gpt4 key购买 nike

我有一个带有一些线程的简单应用程序,我需要从某个线程更新 SWING GUI(我正在使用 Netbeans)。

这是我需要更新的主表单:

public class mainForm extends javax.swing.JFrame {
private gameControll obj;
public mainForm() {

initComponents();
}
public void runAuto(){
ThreadTest th1 = new ThreadTest(1, 1, obj);
ThreadTest th8 = new ThreadTest(8, 95000, obj);
ThreadTest th2 = new ThreadTest(2, 100000, obj);
ThreadTest th3 = new ThreadTest(3, 120000, obj);
ThreadTest th4 = new ThreadTest(4, 140000, obj);
ThreadTest th22 = new ThreadTest(22, 1000, obj);

Thread thread1 = new Thread(th1);
Thread thread2 = new Thread(th2);
Thread thread3 = new Thread(th3);
Thread thread4 = new Thread(th4);
Thread thread22 = new Thread(th22);
Thread thread8 = new Thread(th8);

thread1.start();
thread2.start();
thread3.start();
thread4.start();
thread22.start();
thread8.start();

}
public static void main(String args[]) {

SwingUtilities.invokeLater(new Runnable() {
public void run() {
mainForm app = new mainForm();
app.setVisible(true);
}
});
}
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton10;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton3;
private javax.swing.JButton jButton4;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField pathtbox;
}

现在我有一些线程:

public class ThreadTest implements Runnable {
public static mainForm main = new mainForm();
private final int functionNumber;
private final int time2start;
public ThreadTest(int functionNumber, int time2start, gameControll obj){
this.functionNumber = functionNumber;
this.time2start = time2start;

}

@Override
public void run(){

try{Thread.sleep(time2start);}catch(Exception ex){}//Time Delay before executing methods
switch(functionNumber){
case 1:
//System.out.println("case 1");
obj.runFirst();
break;
case 2:
// System.out.println("case 2");
obj.runSecond();

break;
case 3:

{
try {
obj.runThird();
} catch (IOException ex) {
Logger.getLogger(ThreadTest.class.getName()).log(Level.SEVERE, null, ex);
}
}
break;
...

在其他类(class)中我有:

  public void runFirst(){
System.out.println("I need to show this text on jlabel5");
}

代码的每个部分都位于不同的文件(类)中。我如何在这里实现 Swing 工作程序以便能够在我的主 GUI 表单上显示文本?

最佳答案

How would i implement Swing worker here to be able to show text on my main GUI form?

根据您的代码中观察到的功能列表:

  • 您希望在执行任务时有一个初始延迟。
  • 任务应按顺序执行。
  • 任务旨在更新 GUI 组件,但不执行繁重的任务(即:设置标签的文本)。

国际海事组织Swing Timer在这种情况下,比 Swing worker 更适合。您可以定义多个可以访问 MainForm 类实例的计时器,以执行所需的操作并更新完全相同的表单(现在),而不是使用实现 Runnable 接口(interface)的类您创建一个新表单作为 ThreadTest 类的类成员)。例如:

    Timer timer1 = new Timer(1, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mainFrame.runFirst();
}
});
timer1.setRepeats(false);

Timer timer2 = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mainFrame.runSecond();
}
});
timer2.setRepeats(false);
...
timer1.start();
timer2.start();
...

其中 MainFrame#runFirst() 应如下所示:

public void runFirst() {
jlabel5.setText("Label#5 updated from Timer!");
}

关于java - 从线程更新 Swing GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26588763/

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