我正在尝试使用一个单独的线程来完成Java中的嵌套for循环(以避免冻结的UI,并使事情更简单):
public class scan2D extends Thread{
public void run(){
float data;
for (int y = 0; y<GUI.max_y; y++) {
for (int x = 0; x<GUI.max_x; x++) {
GUI.model.set(GUI.edaq.getdata());
}
}
GUI.model.save();
}
}
scan2d对象在GUI对象中创建,并通过按下GUI的开始按钮启动。一切正常,除了“模型”对象只更新一次,最后由所有数据更新,而不是一个一个。我想在从“edaq”读取数据并将其发送到模型后立即更新。通过视图观察模型。如何立即进行更新?
更新 感谢您的所有帮助建议和意见!对不起,我没有包含显然导致问题的所有代码。我是初学者。我做了一个简化的,最小的“工作”示例,它也显示了症状:
package test;
public class GUI {
static Model model;
static scan2D scan2d;
public GUI() {
model = new Model();
scan2d = new scan2D();
scan2d.start();
}
public static void main(String[] args) {
new GUI();
}
}
class Model {
public void set(int data)
{
System.out.print(data);
}
}
public class scan2D extends Thread {
public void run(){
int data;
for (int y = 0; y<=10; y++) {
for (int x = 0; x<=10; x++) {
try {Thread.sleep(100);}
catch(InterruptedException ex){}
GUI.model.set(x+y);
}
}
}
}
当我尝试延迟100ms时,我同时获得netbeans输出窗口末尾显示的所有数据。当我使用1000时,它工作,数据在输出上逐个显示。这只是一个显示问题吗?
答案 0 :(得分:0)
在您的情况下,您应该在每次数据更改时启动新线程(也就是执行run
方法)。在模型的所有更改完成后,我只能猜测您只启动一次新线程。我是对的吗?
答案 1 :(得分:0)
您的GUI如何观察模型中的变化?我假设您必须通知该人执行更新。必须在事件派发线程上执行此通知。
影响gui的一切必须发生在gui的线上 - 例如通过
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
// update guy
}
});
答案 2 :(得分:0)
我认为问题可能是您的模型仅在GUI.model.save();
发送通知。所以你应该致电GUI.model.save()
;每次更改模型后:
public class scan2D extends Thread{
public void run(){
float data;
for (int y = 0; y<GUI.max_y; y++) {
for (int x = 0; x<GUI.max_x; x++) {
GUI.model.set(GUI.edaq.getdata());
GUI.model.save();
}
}
}
}