所以我正在制作的程序使用2个线程:一个用于GUI,另一个用于工作。
我希望工作线程/类的更新能够在GUI类中的JTextArea上打印出来。 我尝试的一切似乎都没有用。我在行后面添加了一些行来打印文本,以便在JTextArea中添加文本以确保它已经到达行但是每次控制台都有文本但是GUI中的JTextArea没有发生任何变化。
public static void consoleText(String consoleUpdate){
GUI.console.append(consoleUpdate);
}
我在工人阶级尝试了这个,但什么也没发生。 任何人都知道如何解决我的问题?
编辑:
MAIN.JAVA
public class main {
public static void main(String[] args) {
Thread t1 = new Thread(new GUI());
t1.start();
}
GUI.JAVA
public class GUI extends JFrame implements Runnable{
public static JTextArea console;
private final static String newline = "\n";
public void run(){
GUI go = new GUI();
go.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
go.setSize(350, 340);
go.setVisible(true);
}
public GUI(){
setLayout(new FlowLayout());
console = new JTextArea(ConsoleContents, 15, 30);
add(console);
}
WORK.JAVA
...{
consoleText("\nI want this text on the JText Area");
}
public static void consoleText(String consoleUpdate){
GUI.console.append(consoleUpdate);
}
答案 0 :(得分:1)
首先,如前所述,您的GUI应仅在事件派发线程上运行。
正如编写的那样,你的GUI类做了两件事:它是一个框架,一个是runnable,两者都是 完全独立使用。事实上,在GUI对象上调用“run”会创建另一个不相关的GUI对象。这可能是你什么也看不见的原因。
因此,我建议您使用以下内容:
... main(...) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
GUI gui= new GUI();
gui.setVisible(true); // and other stuff
}
});
}
(我还建议摆脱BTW的所有“静态”字段。它可能是源头 你的问题,以及“跑”方法的奇怪之处。)
现在,我假设您从另一个线程调用的“consoleText”方法不应该 直接修改文本,但调用SwingUtilities.invokeLater()来执行此操作:
public void consoleText(final String consoleUpdate){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
console.append(consoleUpdate);
}
});
}
(“最终”声明很重要,因为它允许Runnable使用consoleUpdate变量。)