gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:04:05 24 4
gpt4 key购买 nike

我有两个类,一个 JFrame 和一个实现 runnable 的外部类。我想在自己的线程中运行外部类,直到收到停止命令。我还希望它通过在其类中实现的方法在其自己的线程中更新后台 JFrame 上的值(或者这就是我认为最优雅的方法)。

我制作了一个简单的程序来说明我想要做什么并表明它不起作用。据我了解,从 EDT 外部调用时 JFrame 的值不会更新。我一直在寻找修复方法,将您想要在 invokelater() 调用中更改文本值的代码部分包装起来。但是,这仍然不起作用。我真的很困惑,而且我确信这很简单,我只是不明白为什么这不起作用。

在这个简单的示例中,我在 JFrame 中有一个开始按钮和输出。我实例化外部类,并在按下启动按钮时将其作为 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;

我的外部类(class):

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

最佳答案

创建 JavaExternClass 的新实例时,您正在创建一个新实例 JavaTestForm ...这怎么还没有以 StackOverflowException 结束目前我无法理解,但“其他”问题是 JavaTestForm 的实例在JavaExternClassmain 中创建的内容无关这实际上是屏幕上的用户界面。

而不是 JavaExternClass创建 JavaTestForm 的新实例,您应该传递 JavaTestForm 的引用到它...

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

现在,当涉及到这些事情时,我陷入困境,但是,我不想将类传递给其他类,这些类具有接收者不应该知道或无法访问的其他功能,什么都没有比某些类删除所有组件更糟糕!

相反,我会创建一个 interface其中描述了 JavaExternClass 的操作想要在 JavaTestForm 上执行和实现此类,从而仅公开 JavaExternClass 的功能期望,没有别的。

您可能还想看看Concurrency in SwingInitial Threads

关于java - 从外部类和线程调用Jframe中的方法来设置标签值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27955034/

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