【发布时间】:2015-03-13 08:24:41
【问题描述】:
我有两个类,一个是 JFrame,另一个是实现可运行的外部类。我想在自己的线程中运行的外部类,直到收到停止命令。我还希望它通过在其类中实现的方法在其自己的线程中在后台更新 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;
我的外部类:
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;
}
【问题讨论】:
-
读了你的简历后,我明白你为什么提到 SSCCE 和 MCVE。
-
我编写了 SSCCE 并帮助创建了 MCVE,原因与我经常链接到它们的原因相同(并且写了很多)。因为准备 MCVE/SSCCE 既是一种很好的调试技术,也是一种与他人交流问题的好方式。目前,我正在使用 2 位代码,其中一个包含一个“钢琴键盘”,允许用户选择一种乐器,单击一个键并听到该乐器在该音调下的声音。但我试图增加加载和播放 MIDI 曲调并显示正在播放的键并遇到问题的能力。所以我创建了一个 MCVE 来测试..
-
.. 想法。它根本没有 GUI(因为 GUI 与问题无关),只专注于播放 MIDI 序列,同时尝试检测音符开/关控制代码(这是我尚未设法解决的问题)。
标签: java multithreading swing jframe thread-synchronization