Java Swing从Swing接口启动模拟并从线程写入。怎么用?
问题是我在代码中迷失了自我。 首先,我的项目应该模拟一个商店队列。 现在,我制作了我的Swing界面,从中获取数据。当按下模拟按钮时,我想开始模拟。诀窍在于我不知道如何在不创建新接口的情况下在字段中写入 我的接口代码(我只留下我认为重要的代码): 我在类Java Swing从Swing接口启动模拟并从线程写入。怎么用?,java,multithreading,swing,Java,Multithreading,Swing,问题是我在代码中迷失了自我。 首先,我的项目应该模拟一个商店队列。 现在,我制作了我的Swing界面,从中获取数据。当按下模拟按钮时,我想开始模拟。诀窍在于我不知道如何在不创建新接口的情况下在字段中写入 我的接口代码(我只留下我认为重要的代码): 我在类Magazin中创建线程,其中我有simulation()methode: public void simulation() { for (int i = 0; i < nrClienti; i++) {
Magazin
中创建线程,其中我有simulation()
methode:
public void simulation() {
for (int i = 0; i < nrClienti; i++) {
int aux = shortestQueue(cozi);
Client c = generateClient();
new Threads(cozi[aux], c, aux, avgWaitTime).start();
}
}
public void simulation(){
对于(int i=0;i
线程扩展了线程,下面是代码:
public class Threads extends Thread {
private Coada coada;
private Client c;
private int i, avgWaitTime;
public Threads(Coada q, Client c, int aux, int avgWaitTime) {
this.coada = q;
this.c = c;
this.i = aux;
this.avgWaitTime = avgWaitTime;
}
@Override
public void run() {
coada.enque(c);
int s = 0;
for (int i = 0; i < coada.getSize(); i++){
s = s + coada.getClient().getservTime();
}
avgWaitTime=avgWaitTime+s;
try {
sleep(s);
} catch (InterruptedException e) {
// waiting to finish service time
e.printStackTrace();
}
SwingUtilities.invokeLater(new Runnable() { public void run() {
intf.UpdateTextField(coada.toString(), i); } });
coada.deque();
SwingUtilities.invokeLater(new Runnable() { public void run() {
intf.UpdateTextField(coada.toString(), i); } });
}
}
公共类线程扩展线程{
私人科阿达科阿达;
私人客户c;
私有int i,avgWaitTime;
公共线程(Coada q、客户端c、int aux、int avgWaitTime){
这是coada=q;
这个.c=c;
i=aux;
this.avgWaitTime=avgWaitTime;
}
@凌驾
公开募捐{
科阿达·恩克(c);
int s=0;
对于(int i=0;i
它只需在队列中插入一个对象,在JTextField中显示队列,删除一个对象并重新显示即可。我找到了invokeLater示例,但它需要创建一个新的接口intf。或者不,我迷路了。
请帮忙。非常感谢您抽出时间
另外,如果我有什么不清楚的地方,或者我忘了提什么,请告诉我
诀窍在于我不知道如何在不创建新接口的情况下在字段中写入
问题是,当您创建文本字段以启动模拟时,您正在将文本字段的内容传递给
Magazin
。之后(即运行时),Magazin
无法更新文本字段。相反,尝试传递对interdata
的引用,该引用由Magazin
存储在final
字段变量中。然后可以在调用器中使用此变量来更新文本字段。还可以使用invokeAndWait
获取字段中的文本。一般来说,invokeAndWait
可以用来代替invokeLater
,只要在短时间内阻止调用线程不会有任何负面影响。“问题是我在代码中迷失了自我。”找到你自己的一个好方法就是将代码细化到一个新的层次。顺便说一句,要么你忘了问问题,要么你忘了在上面加一个“?”。“诀窍是我不知道如何在不创建新接口的情况下在字段中编写。”
——这对我来说非常不清楚。既然这似乎是你的主要问题,你能详细谈谈这个问题吗?好吧,交易是我想从我的线程
中写入那些JtextFields
,而不必实例化一个新的interdata
。我通过使它们静止来解决我的问题。现在一切都好了。谢谢:D
public class Threads extends Thread {
private Coada coada;
private Client c;
private int i, avgWaitTime;
public Threads(Coada q, Client c, int aux, int avgWaitTime) {
this.coada = q;
this.c = c;
this.i = aux;
this.avgWaitTime = avgWaitTime;
}
@Override
public void run() {
coada.enque(c);
int s = 0;
for (int i = 0; i < coada.getSize(); i++){
s = s + coada.getClient().getservTime();
}
avgWaitTime=avgWaitTime+s;
try {
sleep(s);
} catch (InterruptedException e) {
// waiting to finish service time
e.printStackTrace();
}
SwingUtilities.invokeLater(new Runnable() { public void run() {
intf.UpdateTextField(coada.toString(), i); } });
coada.deque();
SwingUtilities.invokeLater(new Runnable() { public void run() {
intf.UpdateTextField(coada.toString(), i); } });
}
}