Java多线程打开更多帧

时间:2018-04-03 17:24:25

标签: java multithreading oop

我必须模拟supermaket结帐。客户进来并结账。 actionlistener放在一个名为View的类中,我设置了一些参数,比如服务客户端的最大时间,最大模拟时间等.MainFrame类包含textarea和checkout和客户端的一些图形表示。

    ok=new JButton("OK");
    ok.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                int i;
                int nr = 4;
                Checkout c[] = new Checkout[ nr ];
                for( i=0; i<nr; i++){
                    c[ i ] = new Checkout("Checkout "+Integer.toString( i ));
                    c[ i ].start();
                } 
                Shop p = new Shop( nr , c, "Producer",30);
                p.start();
            }
    });

public class Shop extends Thread {

private Checkout checout[];
private int nr_checkout;
static int id =0;
private int nr_clients;
MainFrame f = new MainFrame();

public Shop(int nr_checkout, Checkout checkout[], String name, int nr_clients) {
    setName(name);
    this.nr_checkout = nr_checkout;
    this.checkout = new Checkout[nr_checkout];
    this.nr_clients = nr_clients;
    for(int i =0; i<nr_checkout;i++) {
        this.checkout[i]=checkout[i];
    }
}

private int min_index() {
    int index = 0;
    try {
        long min = checkout[0].length_tail();
        for(int i =1 ; i<nr_checkout;i++) {
            long lung = checkout[i].length_tail();
            if(lung<min) {
                min = lung;
                index = i;
            }
        }
    }catch ( InterruptedException e ) {
        System.out.println(e.toString());
    }
    return index;
}

 public void run(){
     try{
         int i=0;
         while( i<nr_clients ){
             i++;
             Client c = new Client(2,1,id++);  //(serv time, waiting time,id)
             int m = min_index();
             f.display("\nClient :" +Long.toString( id )+" add to Checkout "+ Integer.toString(m));
             checkout[m].add_client( c );
             sleep( (int) (Math.random()*1000) );
         }
     }
     catch( InterruptedException e ){
         System.out.println( e.toString());
     }
 }

问题是,当我按下ok按钮时,它会打开5个MainFrames。

编辑:MainFrame类

public class MainFrame extends JFrame{

public JFrame mainFrame;
public JTextArea log;
public JLabel casa, coada, casa2, coada2 ;
public JPanel p1,p2;

public MainFrame(){
    mainFrame = new JFrame("Simulator MultiThread");
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);;
    mainFrame.setSize(700, 700);
    mainFrame.setLayout(new GridLayout(1,2));

    JPanel p1 = new JPanel();
    p1.setLayout(new GridLayout(2,1));
    casa = new JLabel("",JLabel.LEFT);
    casa.setText("Checkout 1: ");
    coada = new JLabel("",JLabel.LEFT);
    coada.setText("Clients");

    casa2 = new JLabel("",JLabel.LEFT);
    casa2.setText("Checkout 2: ");
    coada2 = new JLabel("",JLabel.LEFT);
    coada2.setText("Clients: ");


    p1.add(casa);
    p1.add(coada);
    p1.add(casa2);
    p1.add(coada2);
    log = new JTextArea(30, 30);
    mainFrame.add(p1);
    mainFrame.add(log);

    mainFrame.setVisible(true);
}


public void display(String string) {
    log.append(string);
}
}

0 个答案:

没有答案