当前位置: 首页 > 知识库问答 >
问题:

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

孟泽宇
2023-03-14

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

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

   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个答案

岳茂
2023-03-14

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

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

 类似资料:
  • 问题内容: 似乎当我实例化12个Swing Worker线程时,前六个开始完成其任务,它完成,然后最后六个开始并完成。我要寻找的行为是所有12个线程同时开始工作并同时完成。 我有以下内容: myTask m将以25的增量从0-100递增进度条。我得到了奇怪的行为,前六个线程开始递增,以100结束,然后最后六个线程从0开始并递增并完成。 是否可以限制一个Swing Worker线程数量? 问题答案:

  • 作为一名Java Swing新手,我在将用户界面逻辑与域逻辑分离时遇到了一些困难。 我有一个小的(琐碎的?)带有JFrame的Swing应用程序,其中包含JLabel、JTextField和JButton。按下JButton时,会弹出JFileChooser对话框。选择文件后,JTextField包含文件的绝对路径。到目前为止还没有什么引人注目的。我想完成的下一件事是将文件的绝对路径“注入”到一个

  • 我正在使用Jmeter测试多个微服务。基本思想是在微服务环境中测试断路器。现在,我使用两个线程组,一个主从远程概念。一个线程组创建使用100次迭代和1000个线程,并对前端服务创建负载,前端服务向后端服务发送请求。另一组用100次迭代但只有一个线程探测后端服务。如果我没有错,第二个线程组比第一个线程组完成得更早。有可能同步这两个吗? 也许还有另一个问题。当我用遥控器缩放线程时,第二个线程组也会缩放

  • 目前,我正在尝试使用SwingWorker构建Swing应用程序,以不断更新面板。 我想在这里完成的是从数据库加载数据,每个数据都将作为面板中的图标发布。图标的颜色基于严重程度字段的值。例如: 示例数据在这张图片中,我有12个对象_id A001的数据。doInBackground()方法中的函数将循环12次,并调用publish()函数在面板中显示图标。图标的颜色基于每个对象id的严重性字段的最

  • 问题内容: 我知道我知道,到处已经有上百万个问题和答案。关于它的大量真正详尽的文章,几种示例。我已经花了几个小时阅读有关它的信息,但这并不能解决问题。我之所以这样问,是因为我仍然不安静地理解我需要做的事情,显然是因为我的代码仍然无法正常工作。我想到了Swing如何与EDT一起工作,并且如果要使用ServerSocket的accept()方法,我将需要为Swing启动一个新线程(我认为?)。当我按原

  • 怎么画线段? 上一讲我们已经得到了咱们的画布和画笔,在发挥艺术家之魂前,还是要像小孩牙牙学语一样,我们也得从画一条线段开始。因为画线段是最简单的,最基础的。但是别小看了它。下面是我从度娘那里找到的一个由线条组成的图像。 是不是很有魔性? 言归正传。怎么画线条?和现实中画画差不多: 移动画笔,使画笔移动至绘画的开始处 确定第一笔的停止点 规划好之后,选择画笔(包括画笔的粗细和颜色等) 确定绘制 因为