从外部类和线程调用jframe中的java方法来设置标签值

a5g8bdjr  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(370)

我有两个类,一个jframe和一个实现runnable的外部类。我想在自己的线程中运行的外部类,直到发出停止命令。我还希望它在自己的线程中通过类内实现的方法在后台更新jframe上的值(或者我认为最优雅的方法就是这样)。
我已经做了一个简单的程序来说明我想做什么,并表明它不工作。据我所知,当从edt外部调用时,jframe的值不会更新。我一直在寻找修复程序来 Package 代码中您希望更改文本值的部分 invokelater() 打电话。然而,这仍然不起作用。我真的很为难,我肯定这是件很简单的事,我只是不明白为什么这不起作用。
在这个简单的例子中,我在jframe中有一个start按钮和输出。我示例化了我的外部类,并在按下start按钮时将其作为jframe类中的线程启动。线程在外部类中,并更新输出,直到达到5。它通过调用jframe中调用 setText() 在输出标签上。
jframe(我将省略自动生成的部分):

package javaapplicationtest;

public class JavaTestForm extends javax.swing.JFrame {

public JavaTestForm() {
    initComponents();
    jtf = new JavaExternClass();
    jtf_thread = new Thread(jtf);
}

/* Method I use outside of this class to update output label */
public void setLabel(int in) {
    final int inf = in;
    System.out.println("Setting output to " + in);

    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            output.setText(Integer.toString(inf));
        }
    });
}

/* Start button is pressed */
private void startActionPerformed(java.awt.event.ActionEvent evt)   {                                      
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            jtf_thread.start();
        }
    });
}   

/* Main entry */
public static void main(String args[]) {
    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new JavaTestForm().setVisible(true);
        }
    });
}

/* External class */
private JavaExternClass jtf;
private Thread jtf_thread;

我的外部课程:

package javaapplicationtest;

import java.util.logging.Level;
import java.util.logging.Logger;

public class JavaExternClass implements Runnable {    
    public void run() {
        gui = new JavaTestForm();
        for (int i = 0; i < 4; i++) {
            gui.setLabel(i); // Call method to set form output
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(JavaTestForm.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    private JavaTestForm gui;
}
nqwrtyyt

nqwrtyyt1#

创建的新示例时 JavaExternClass ,您正在创建一个新示例 JavaTestForm …怎么还没结束呢 StackOverflowException 我现在不明白,但另一个问题是 JavaTestFormJavaExternClass 与在中创建的对象无关 main 它实际上就是屏幕上的用户界面。
而不是 JavaExternClass 创建的新示例 JavaTestForm ,你应该通过 JavaTestForm 对它。。。

public class JavaExternClass implements Runnable {   
    private JavaTestForm gui;
    public JavaExternClass(JavaTestForm gui) {
        this.gui = gui;

现在,当涉及到这些事情时,我是一个泥巴,但是,我不想把类传递给其他类,这些类具有收件人不应该知道或访问的其他功能,没有什么比删除所有组件的类更糟糕的了!
相反,我会创建一个 interface 描述了 JavaExternClass 希望在上执行和实现此类 JavaTestForm ,从而只公开 JavaExternClass 没有别的。
您可能还想看看swing和初始线程中的并发性

相关问题