gpt4 book ai didi

java - Swing从Swing接口(interface)开始模拟并从线程写入。如何?

转载 作者:行者123 更新时间:2023-12-02 04:49:13 25 4
gpt4 key购买 nike

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

我的界面代码(我只留下了我认为重要的部分):

   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 中创建线程,其中有 simulation() 方法:

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

}
}

Threads 扩展了 Thread,代码如下:

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


}
}

它只需在队列中插入一个对象,在 JTextField 中显示队列,删除一个对象并重新显示。我找到了 invokeLater 示例,但它需要创建一个新的接口(interface) intf。或者不是,我迷路了。请帮忙。非常感谢您的宝贵时间!

附注如果我有什么不清楚的地方或者我忘记提及什么,请告诉我。

最佳答案

The trick is that I'm not sure how to write in the fields without creating a new Interface.

问题是当您创建文本字段以启动模拟时,您将文本字段的内容传递给 Magazin 。之后(即运行时)Magazin 无法更新文本字段。相反,请尝试传递对 Magazin 存储在 final 字段变量中的 Interfata 的引用。然后就可以在 invokeLater 中使用此变量来更新文本字段。还可以使用 invokeAndWait 获取字段中的文本。一般来说,当短暂阻塞调用线程没有负面影响时,可以使用 invokeAndWait 代替 invokeLater

关于java - Swing从Swing接口(interface)开始模拟并从线程写入。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29397317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com