当前位置: 首页 > 知识库问答 >
问题:

从线程更新摆动 GUI

柴赞
2023-03-14

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

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

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;
...

在其他班级,我有:

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

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

共有1个答案

赫连智
2023-03-14

我如何在这里实现 Swing 工作人员,以便能够在我的主 GUI 窗体上显示文本?

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

  • 您希望执行任务的初始延迟
  • 任务将按顺序执行
  • 任务用于更新GUI组件,但不用于执行繁重的任务(即:设置标签的文本)

在这种情况下,IMO Swing Timer比Swing worker更适合。您可以不使用实现< code>Runnable接口的类,而是定义几个访问< code>MainForm类实例的计时器,以便执行所需的操作并更新完全相同的表单(现在您创建一个新表单作为< code>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();
    ...

其中< code > MainFrame # run first()应如下所示:

public void runFirst() {
    jlabel5.setText("Label#5 updated from Timer!");
}
 类似资料:
  • 问题内容: MyDialog类只有很少的组合和文本字段,并且正在用DB值填充组合。在选择一个组合值时,我从数据库获取了另一个值以填充下一个组合。 上面的程序以相同的方式运行,而不使用invokeLater线程。什么时候invokeLater在Swing编程中变得有用。我已经读过一些,但似乎都是理论上的。invokeLater对应用程序有什么区别?仅在main方法内部使用它就足够了还是应该在操作侦听

  • 我对Android很陌生,我试图弄清楚片段和活动应该如何协同工作。我有一个非常丑陋的布局。1个活性和1个“根”片段。当用户单击左侧菜单时,片段被片段管理器替换。 我假设上面的代码应该用新的片段替换当前片段。片段实际上总是空的。我不知道为什么。 在onCreateView的RootFrament Fragment1是默认创建的。 在rootFragment的onCreateView中,rootFra

  • 问题内容: 亲爱的大家,我遇到了挥杆相关的问题。由于违反公司政策,我无法共享代码,因此我将尽力解释该问题。 简而言之,我创建了一个扩展包含JLabel的JWindow的类。JLabel的文本是通过计时器对象随机更新的,该计时器对象使用scheduleAtFixedRate方法每50毫秒实例化一个TimerTask。JLabel中的值是通过在一个单独的线程(称为传输线程)中调用一个方法来检索的,该线

  • 在我的JavaFX应用程序中,我想显示来自后台线程的实时数据。有人知道如何从后台线程更新linechart吗?谢谢你。下面是一些示例代码。 TM的 预览图像 采样控制器 } 处理类。启动线程。 任务类。执行任务的线程类 主类 样品fxml

  • 我正在编写一个Android应用程序,它连接到蓝牙设备,读取设备发送的数据,将其添加到AChartEngine图形中,并在文本视图中显示数据。 我的Bluetooth代码与BluetoothChat示例代码中的线程实现非常相似(它与SDK一起提供)。我可以在LogCat中看到< code>ConnectedThread循环正在执行并因此获得新数据,但我的TextView在7行之后停止更新,图形间歇

  • 问题内容: 我正在使用JPanel(更改其组件),但是我想从External JFrame进行更改。 抱歉,我使用Netbeans编写了这段代码(我知道它放了一些该问题不需要的东西),并尝试对其进行干净的编辑,因为它的实际代码更大 这是JPanel的代码,名称为“ MyPanel”。 框架!!! 当执行该操作时,JPanel( 审核INNER CALL )起作用!但是JFrame( 审核// OU