我有两个类,一个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;
}
1条答案
按热度按时间nqwrtyyt1#
创建的新示例时
JavaExternClass
,您正在创建一个新示例JavaTestForm
…怎么还没结束呢StackOverflowException
我现在不明白,但另一个问题是JavaTestForm
在JavaExternClass
与在中创建的对象无关main
它实际上就是屏幕上的用户界面。而不是
JavaExternClass
创建的新示例JavaTestForm
,你应该通过JavaTestForm
对它。。。现在,当涉及到这些事情时,我是一个泥巴,但是,我不想把类传递给其他类,这些类具有收件人不应该知道或访问的其他功能,没有什么比删除所有组件的类更糟糕的了!
相反,我会创建一个
interface
描述了JavaExternClass
希望在上执行和实现此类JavaTestForm
,从而只公开JavaExternClass
没有别的。您可能还想看看swing和初始线程中的并发性