问题是我迷失在我的代码中。首先,我的项目应该模拟商店队列。现在,我在获取数据的地方制作了我的摇摆界面。当按下模拟按钮时,我想开始模拟。诀窍是,我不确定如何在不创建新界面的情况下在字段中编写。
我的接口代码(我只留下了我认为重要的内容):
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、 如果我有什么不清楚的地方,或者我忘了提什么,请告诉我。
诀窍是我不确定如何在不创建新界面的情况下在字段中编写。
问题是,当您创建文本字段以启动模拟时,您正在将文本字段的内容传递给Magazin。之后(即运行时),Magazin无法更新文本字段。相反,尝试将引用传递给Magazin存储在最终字段变量中的Interdata。然后可以在调用器中使用此变量来更新文本字段。还可以使用invokeAndWait获取字段中的文本。一般来说,如果暂时阻塞调用线程没有坏处,那么可以使用invokeAndWait来代替
invokeLater
。