Java 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++) {

问题是我在代码中迷失了自我。 首先,我的项目应该模拟一个商店队列。 现在,我制作了我的Swing界面,从中获取数据。当按下模拟按钮时,我想开始模拟。诀窍在于我不知道如何在不创建新接口的情况下在字段中写入

我的接口代码(我只留下我认为重要的代码):

我在类
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); } });


        }
     }