提问者:小点点

Swing从Swing界面开始模拟并从线程写入。如何?


问题是我迷失在我的代码中。首先,我的项目应该模拟商店队列。现在,我在获取数据的地方制作了我的摇摆界面。当按下模拟按钮时,我想开始模拟。诀窍是,我不确定如何在不创建新界面的情况下在字段中编写。

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

   public class Interfata extends JFrame {

   public void UpdateTextField(String name, int i)
   {
      switch(i){
      case 0: this.txtField8.setText(name); break; 
      case 1: this.txtField9.setText(name); break;
      case 2: this.txtField10.setText(name); break;
      case 3: this.txtField11.setText(name); break;
      case 4: this.txtField12.setText(name); break;
      case 5: this.txtField7.setText(name); break;
      default : this.txtField7.setText(name); break;
    }
   }
   private Interfata() {

    mybutton = new JButton("Simulate");
    mybutton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            Magazin shop = new Magazin(toNumber(txtField6.getText()),
                    toNumber(txtField1.getText()), toNumber(txtField2
                            .getText()), toNumber(txtField3.getText()),
                    toNumber(txtField4.getText()), toNumber(txtField5
                            .getText()));

            shop.simulation();
            }
    });
}


public static void main(String[] args) {

    Interfata interfataMea = new Interfata();
    interfataMea.setTitle("Shop Simulator");
    interfataMea.setSize(1000, 700);
    interfataMea.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    interfataMea.setVisible(true);
   }
 }

我在类Magazin中创建线程,其中我有模拟()方法:

 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 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); } });


        }
     }

它只需要在Queue中插入一个对象,在JTextField中显示Queue,删除一个对象并重新显示。我找到了调用稍后的示例,但它需要制作一个新的Interface intf。或者没有,我迷路了。请帮助。非常感谢您的时间!

P、 如果我有什么不清楚的地方,或者我忘了提什么,请告诉我。


共1个答案

匿名用户

诀窍是我不确定如何在不创建新界面的情况下在字段中编写。

问题是,当您创建文本字段以启动模拟时,您正在将文本字段的内容传递给Magazin。之后(即运行时),Magazin无法更新文本字段。相反,尝试将引用传递给Magazin存储在最终字段变量中的Interdata。然后可以在调用器中使用此变量来更新文本字段。还可以使用invokeAndWait获取字段中的文本。一般来说,如果暂时阻塞调用线程没有坏处,那么可以使用invokeAndWait来代替invokeLater

相关问题