Files
simulation-canteen/src/gui/StartPanel.java
T
2013-01-09 21:05:59 +01:00

491 lines
22 KiB
Java

package gui;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class StartPanel extends JPanel
{
private static final long serialVersionUID = 1L;
private MyFrame frame;
private Thread canteenThread;
private SpinnerNumberModel spinnerModel;
private JSpinner maxSimTimeSpinner;
private JSpinner cashierSpinner;
private JSpinner cookSpinner;
private JSpinner table2Spinner;
private JSpinner table4Spinner;
private JSpinner minTimeClientSpinner;
private JSpinner maxTimeClientSpinner;
private JSpinner groupFreqSpinner;
private JSpinner groupSizeSpinner;
private JSpinner priviligedFreqSpinner;
private JSpinner highPriceSpinner;
private JSpinner longQueueSpinner;
private JSpinner minServiceTimeSpinner;
private JSpinner maxServiceTimeSpinner;
private JSpinner minEatTimeSpinner;
private JSpinner maxEatTimeSpinner;
private JSpinner minFoodPrepareTimeSpinner;
private JSpinner maxFoodPrepareTimeSpinner;
private JSpinner minValueIngredientSpinner;
private JSpinner mealPriceSpinner;
private LinkedList<String> paramList;
private JButton startButton;
private int minTimeClientValue;
private int maxTimeClientValue;
private int minClientServiceTime;
private int maxClientServiceTime;
private int minEatTimeValue;
private int maxEatTimeValue;
private int minFoodPrepareTimeValue;
private int maxFoodPrepareTimeValue;
StartPanel(MyFrame _frame)
{
frame = _frame;
canteenThread = new Thread(frame.getCanteen());
paramList = new LinkedList<String>();
add(new JLabel("Parametry symulacji"));
add(Box.createRigidArea(new Dimension(0, 20)));
setLayout(new BoxLayout(this, 1));
//wymiary
Dimension rigidInBox = new Dimension(10, 0); //miedzy elementami w box'ie
Dimension rigidOutBox = new Dimension(0, 5); //miedzy box'ami
Dimension spinnerSize = new Dimension(60, 20); //wymiar spinner'a
//max czas symulacji
Box timeBox = Box.createHorizontalBox();
JLabel maxTimeLabel = new JLabel("Maksymalny czas symulacji [h]");
timeBox.add(maxTimeLabel);
spinnerModel = new SpinnerNumberModel(4, 1, 10, 1);
maxSimTimeSpinner = new JSpinner(spinnerModel);
maxSimTimeSpinner.setMaximumSize(new Dimension(80, 20));
timeBox.add(Box.createRigidArea(rigidInBox));
timeBox.add(maxSimTimeSpinner);
add(timeBox);
add(Box.createRigidArea(rigidOutBox));
//ilosc kasjerek
Box cashierBox = Box.createHorizontalBox();
JLabel cashierLabel = new JLabel("Ilosc kasjerek");
cashierBox.add(cashierLabel);
spinnerModel = new SpinnerNumberModel(1, 1, 8, 1);
cashierSpinner = new JSpinner(spinnerModel);
cashierSpinner.setMaximumSize(spinnerSize);
cashierBox.add(Box.createRigidArea(rigidInBox));
cashierBox.add(cashierSpinner);
add(cashierBox);
add(Box.createRigidArea(rigidOutBox));
//ilosc kucharzy
Box cookBox = Box.createHorizontalBox();
JLabel cookLabel = new JLabel("Ilosc kucharzy");
cookBox.add(cookLabel);
spinnerModel = new SpinnerNumberModel(2, 1, 8, 1);
cookSpinner = new JSpinner(spinnerModel);
cookSpinner.setMaximumSize(spinnerSize);
cookBox.add(Box.createRigidArea(rigidInBox));
cookBox.add(cookSpinner);
add(cookBox);
add(Box.createRigidArea(rigidOutBox));
//ilosc stolow 2-osobowych
Box table2Box = Box.createHorizontalBox();
JLabel table2Label = new JLabel("Ilosc stolow 2-osobowych");
table2Box.add(table2Label);
spinnerModel = new SpinnerNumberModel(5, 1 ,10 ,1);
table2Spinner = new JSpinner(spinnerModel);
table2Spinner.setMaximumSize(spinnerSize);
table2Box.add(Box.createRigidArea(rigidInBox));
table2Box.add(table2Spinner);
add(table2Box);
add(Box.createRigidArea(rigidOutBox));
//ilosc stolow 4-osobowych
Box table4Box = Box.createHorizontalBox();
JLabel table4Label = new JLabel("Ilosc stolow 4-osobowych");
table4Box.add(table4Label);
spinnerModel = new SpinnerNumberModel(5, 1, 10, 1);
table4Spinner = new JSpinner(spinnerModel);
table4Spinner.setMaximumSize(spinnerSize);
table4Box.add(Box.createRigidArea(rigidInBox));
table4Box.add(table4Spinner);
add(table4Box);
add(Box.createRigidArea(rigidOutBox));
//minimalny czas pojawiania sie nowego klienta
Box minTimeClientBox = Box.createHorizontalBox();
JLabel minTimeClientLabel = new JLabel("Min i max czas pojawiania sie nowych klientow [s]");
minTimeClientBox.add(minTimeClientLabel);
spinnerModel = new SpinnerNumberModel(30, 1, 300, 1);
minTimeClientSpinner = new JSpinner(spinnerModel);
minTimeClientValue = (int)minTimeClientSpinner.getValue();
minTimeClientSpinner.setMaximumSize(spinnerSize);
spinnerModel = new SpinnerNumberModel(300, 30, 1200, 1);
maxTimeClientSpinner = new JSpinner(spinnerModel);
maxTimeClientValue = (int)maxTimeClientSpinner.getValue();
maxTimeClientSpinner.setMaximumSize(spinnerSize);
minTimeClientSpinner.addChangeListener(new ChangeListener()
{
@Override
public void stateChanged(ChangeEvent e)
{
minTimeClientValue = (int)minTimeClientSpinner.getValue();
maxTimeClientValue = (int)maxTimeClientSpinner.getValue();
minTimeClientSpinner.setModel(new SpinnerNumberModel(minTimeClientValue, 1, maxTimeClientValue, 1));
maxTimeClientSpinner.setModel(new SpinnerNumberModel(maxTimeClientValue, minTimeClientValue, 1200, 1));
}
}
);
maxTimeClientSpinner.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent arg0)
{
minTimeClientValue = (int)minTimeClientSpinner.getValue();
maxTimeClientValue = (int)maxTimeClientSpinner.getValue();
maxTimeClientSpinner.setModel(new SpinnerNumberModel(maxTimeClientValue, minTimeClientValue, 1200, 1));
minTimeClientSpinner.setModel(new SpinnerNumberModel(minTimeClientValue, 1, maxTimeClientValue, 1));
}
}
);
minTimeClientBox.add(Box.createRigidArea(rigidInBox));
minTimeClientBox.add(minTimeClientSpinner);
minTimeClientBox.add(Box.createRigidArea(rigidInBox));
minTimeClientBox.add(maxTimeClientSpinner);
add(minTimeClientBox);
add(Box.createRigidArea(rigidOutBox));
//czestosc pojawiania sie grupy
Box groupFreqBox = Box.createHorizontalBox();
JLabel groupFreqLabel = new JLabel("Czestosc pojawiania sie grupy (w %)");
groupFreqBox.add(groupFreqLabel);
spinnerModel = new SpinnerNumberModel(50, 1, 100, 1);
groupFreqSpinner = new JSpinner(spinnerModel);
groupFreqSpinner.setMaximumSize(spinnerSize);
groupFreqBox.add(Box.createRigidArea(rigidInBox));
groupFreqBox.add(groupFreqSpinner);
add(groupFreqBox);
add(Box.createRigidArea(rigidOutBox));
//rozmiar grupy
Box groupSizeBox = Box.createHorizontalBox();
JLabel groupSizeLabel = new JLabel("Maksymalny rozmiar grupy");
groupSizeBox.add(groupSizeLabel);
spinnerModel = new SpinnerNumberModel(3, 2, 5, 1);
groupSizeSpinner = new JSpinner(spinnerModel);
groupSizeSpinner.setMaximumSize(spinnerSize);
groupSizeBox.add(Box.createRigidArea(rigidInBox));
groupSizeBox.add(groupSizeSpinner);
add(groupSizeBox);
add(Box.createRigidArea(rigidOutBox));
//czsetosc przychodzenia klientow uprzywilejowanych
Box priviligedFreqBox = Box.createHorizontalBox();
JLabel priviligedFreqLabel = new JLabel("Czestosc pojawiania sie klientow uprzywilejowanych (w %)");
priviligedFreqBox.add(priviligedFreqLabel);
spinnerModel = new SpinnerNumberModel(1, 1, 100, 1);
priviligedFreqSpinner = new JSpinner(spinnerModel);
priviligedFreqSpinner.setMaximumSize(spinnerSize);
priviligedFreqBox.add(Box.createRigidArea(rigidInBox));
priviligedFreqBox.add(priviligedFreqSpinner);
add(priviligedFreqBox);
add(Box.createRigidArea(rigidOutBox));
//sklonnosc do uznawania cen za wysokie
Box highPriceBox = Box.createHorizontalBox();
JLabel highPriceLabel = new JLabel("Srednia akceptowalna cena dan przez klienta");
highPriceBox.add(highPriceLabel);
spinnerModel = new SpinnerNumberModel(10, 8, 15, 1);
highPriceSpinner = new JSpinner(spinnerModel);
highPriceSpinner.setMaximumSize(spinnerSize);
highPriceBox.add(Box.createRigidArea(rigidInBox));
highPriceBox.add(highPriceSpinner);
add(highPriceBox);
add(Box.createRigidArea(rigidOutBox));
//sklonnosc klientow do uznawania kolejki za dluga
Box longQueueBox = Box.createHorizontalBox();
JLabel longQueueLabel = new JLabel("Srednia akceptowalna dlugosc kolejki przez klienta");
longQueueBox.add(longQueueLabel);
spinnerModel = new SpinnerNumberModel(14, 1, 20, 1);
longQueueSpinner = new JSpinner(spinnerModel);
longQueueSpinner.setMaximumSize(spinnerSize);
longQueueBox.add(Box.createRigidArea(rigidInBox));
longQueueBox.add(longQueueSpinner);
add(longQueueBox);
add(Box.createRigidArea(rigidOutBox));
//czas obslugi klienta
Box serviceTimeBox = Box.createHorizontalBox();
JLabel serviceTimeLabel = new JLabel("Min i max czas obslugi klienta [s]");
serviceTimeBox.add(serviceTimeLabel);
spinnerModel = new SpinnerNumberModel(20, 1, 50, 1);
minServiceTimeSpinner = new JSpinner(spinnerModel);
minClientServiceTime = (int)minServiceTimeSpinner.getValue();
minServiceTimeSpinner.setMaximumSize(spinnerSize);
spinnerModel = new SpinnerNumberModel(50, 20, 60, 1);
maxServiceTimeSpinner = new JSpinner(spinnerModel);
maxClientServiceTime = (int)maxServiceTimeSpinner.getValue();
maxServiceTimeSpinner.setMaximumSize(spinnerSize);
minServiceTimeSpinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent arg0) {
// TODO Auto-generated method stub
minClientServiceTime = (int)minServiceTimeSpinner.getValue();
maxClientServiceTime = (int)maxServiceTimeSpinner.getValue();
minServiceTimeSpinner.setModel(new SpinnerNumberModel(minClientServiceTime, 1, maxClientServiceTime, 1));
maxServiceTimeSpinner.setModel(new SpinnerNumberModel(maxClientServiceTime, minClientServiceTime, 60, 1));
}
});
maxServiceTimeSpinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
// TODO Auto-generated method stub
maxClientServiceTime = (int)maxServiceTimeSpinner.getValue();
minClientServiceTime = (int)minServiceTimeSpinner.getValue();
maxServiceTimeSpinner.setModel(new SpinnerNumberModel(maxClientServiceTime, minClientServiceTime, 60, 1));
minServiceTimeSpinner.setModel(new SpinnerNumberModel(minClientServiceTime, 1, maxClientServiceTime, 1));
}
});
serviceTimeBox.add(Box.createRigidArea(rigidInBox));
serviceTimeBox.add(minServiceTimeSpinner);
serviceTimeBox.add(Box.createRigidArea(rigidInBox));
serviceTimeBox.add(maxServiceTimeSpinner);
add(serviceTimeBox);
add(Box.createRigidArea(rigidOutBox));
//czas jedzenia posilku
Box eatTimeBox = Box.createHorizontalBox();
JLabel eatTimeLabel = new JLabel("Min i max czas jedzenia posilku [min]");
eatTimeBox.add(eatTimeLabel);
spinnerModel = new SpinnerNumberModel(12, 5, 25, 1);
minEatTimeSpinner = new JSpinner(spinnerModel);
minEatTimeSpinner.setMaximumSize(spinnerSize);
minEatTimeValue = (int)minEatTimeSpinner.getValue();
spinnerModel = new SpinnerNumberModel(25, 12, 40, 1);
maxEatTimeSpinner = new JSpinner(spinnerModel);
maxEatTimeSpinner.setMaximumSize(spinnerSize);
maxEatTimeValue = (int)maxEatTimeSpinner.getValue();
minEatTimeSpinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent arg0) {
// TODO Auto-generated method stub
minEatTimeValue = (int)minEatTimeSpinner.getValue();
maxEatTimeValue = (int)maxEatTimeSpinner.getValue();
minEatTimeSpinner.setModel(new SpinnerNumberModel(minEatTimeValue, 5, maxEatTimeValue, 1));
maxEatTimeSpinner.setModel(new SpinnerNumberModel(maxEatTimeValue, minEatTimeValue, 40, 1));
}
});
maxEatTimeSpinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
// TODO Auto-generated method stub
minEatTimeValue = (int)minEatTimeSpinner.getValue();
maxEatTimeValue = (int)maxEatTimeSpinner.getValue();
maxEatTimeSpinner.setModel(new SpinnerNumberModel(maxEatTimeValue, minEatTimeValue, 40, 1));
minEatTimeSpinner.setModel(new SpinnerNumberModel(minEatTimeValue, 5, maxEatTimeValue, 1));
}
});
eatTimeBox.add(Box.createRigidArea(rigidInBox));
eatTimeBox.add(minEatTimeSpinner);
eatTimeBox.add(Box.createRigidArea(rigidInBox));
eatTimeBox.add(maxEatTimeSpinner);
add(eatTimeBox);
add(Box.createRigidArea(rigidOutBox));
//czas przygotowania skladnikow w kuchnii
Box foodPrepareTimeBox = Box.createHorizontalBox();
JLabel foodPrepareTimeLabel = new JLabel("Min i max czas przygotowania skladnikow [min]");
foodPrepareTimeBox.add(foodPrepareTimeLabel);
spinnerModel = new SpinnerNumberModel(7, 4, 12, 1);
minFoodPrepareTimeSpinner = new JSpinner(spinnerModel);
minFoodPrepareTimeSpinner.setMaximumSize(spinnerSize);
minFoodPrepareTimeValue = (int)minFoodPrepareTimeSpinner.getValue();
spinnerModel = new SpinnerNumberModel(12, 7, 20, 1);
maxFoodPrepareTimeSpinner = new JSpinner(spinnerModel);
maxFoodPrepareTimeSpinner.setMaximumSize(spinnerSize);
maxFoodPrepareTimeValue = (int)maxFoodPrepareTimeSpinner.getValue();
minFoodPrepareTimeSpinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
minFoodPrepareTimeValue = (int)minFoodPrepareTimeSpinner.getValue();
maxFoodPrepareTimeValue = (int)maxFoodPrepareTimeSpinner.getValue();
minFoodPrepareTimeSpinner.setModel(new SpinnerNumberModel(minFoodPrepareTimeValue, 4, maxFoodPrepareTimeValue, 1));
maxFoodPrepareTimeSpinner.setModel(new SpinnerNumberModel(maxFoodPrepareTimeValue, minFoodPrepareTimeValue, 20, 1));
}
});
maxFoodPrepareTimeSpinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
maxFoodPrepareTimeValue = (int)maxFoodPrepareTimeSpinner.getValue();
minFoodPrepareTimeValue = (int)minFoodPrepareTimeSpinner.getValue();
maxFoodPrepareTimeSpinner.setModel(new SpinnerNumberModel(maxFoodPrepareTimeValue, minFoodPrepareTimeValue, 20, 1));
minFoodPrepareTimeSpinner.setModel(new SpinnerNumberModel(minFoodPrepareTimeValue, 4, maxFoodPrepareTimeValue, 1));
}
});
foodPrepareTimeBox.add(Box.createRigidArea(rigidInBox));
foodPrepareTimeBox.add(minFoodPrepareTimeSpinner);
foodPrepareTimeBox.add(Box.createRigidArea(rigidInBox));
foodPrepareTimeBox.add(maxFoodPrepareTimeSpinner);
add(foodPrepareTimeBox);
add(Box.createRigidArea(rigidOutBox));
//minimalna wartosc skladnika
Box minValueIngredientBox = Box.createHorizontalBox();
JLabel minValueIngredientLabel = new JLabel("Minimalna wartosc skladnika dania");
minValueIngredientBox.add(minValueIngredientLabel);
spinnerModel = new SpinnerNumberModel(4, 1, 20, 1);
minValueIngredientSpinner = new JSpinner(spinnerModel);
minValueIngredientSpinner.setMaximumSize(spinnerSize);
minValueIngredientBox.add(Box.createRigidArea(rigidInBox));
minValueIngredientBox.add(minValueIngredientSpinner);
add(minValueIngredientBox);
add(Box.createRigidArea(rigidOutBox));
//srednia cena dania
Box mealPriceBox = Box.createHorizontalBox();
JLabel mealPriceLabel = new JLabel("Srednia cena dan");
mealPriceBox.add(mealPriceLabel);
spinnerModel = new SpinnerNumberModel(10, 6, 15, 1);
mealPriceSpinner = new JSpinner(spinnerModel);
mealPriceSpinner.setMaximumSize(spinnerSize);
mealPriceBox.add(Box.createRigidArea(rigidInBox));
mealPriceBox.add(mealPriceSpinner);
add(mealPriceBox);
add(Box.createRigidArea(new Dimension(0, 50)));
startButton = new JButton("START");
startButton.setMaximumSize(new Dimension(200, 80));
this.add(startButton);
startButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
frame.getContentPane().removeAll();
frame.add(frame.getAnimPanel());
frame.revalidate();
frame.repaint();
frame.getCanteen().setSimTime((int)maxSimTimeSpinner.getValue());
paramList.add("Czas symulacji: " + (int)maxSimTimeSpinner.getValue() + "h");
frame.getCanteen().setCashierCount((int)cashierSpinner.getValue());
paramList.add("Ilosc kasjerek: " + (int)cashierSpinner.getValue());
frame.getCanteen().setCookCount((int)cookSpinner.getValue());
paramList.add("Ilosc kucharzy: " + (int)cookSpinner.getValue());
frame.getCanteen().setTable2Count((int)table2Spinner.getValue());
paramList.add("Ilosc stolikow 2-osobowych: " + (int)table2Spinner.getValue());
frame.getCanteen().setTable4Count((int)table4Spinner.getValue());
paramList.add("Ilosc stolikow 4-osobowych: " + (int)table4Spinner.getValue());
frame.getCanteen().setClientArrivialTime(Double.parseDouble(Integer.toString((int)minTimeClientSpinner.getValue())), Double.parseDouble(Integer.toString((int)maxTimeClientSpinner.getValue())));
paramList.add("Czas pojawiania sie nowych klientow: " + Integer.toString((int)minTimeClientSpinner.getValue()) + "-" + Integer.toString((int)maxTimeClientSpinner.getValue()) + "s");
frame.getCanteen().setGroupGeneratorMultiplier(100/Double.parseDouble(Integer.toString((int)groupFreqSpinner.getValue())));
paramList.add("Czestosc pojawiania sie grupy: " + Integer.toString((int)groupFreqSpinner.getValue()) + "%");
frame.getCanteen().setMaxGroupSize((int)groupSizeSpinner.getValue());
paramList.add("Maksymalny rozmiar grupy: " + (int)groupSizeSpinner.getValue());
frame.getCanteen().setPriviligedClientMultiplier(100/Double.parseDouble(Integer.toString((int)priviligedFreqSpinner.getValue())));
paramList.add("Czestosc pojawiania sie klientow uprzywilejowanych: " + Integer.toString((int)priviligedFreqSpinner.getValue()) + "%");
frame.getCanteen().setClientAveragePrice(Double.parseDouble(Integer.toString((int)highPriceSpinner.getValue())), Double.parseDouble(Integer.toString((int)highPriceSpinner.getValue()))+5);
paramList.add("Srdnia maksymalna akceptowalna przez klienta cena dan: " + Integer.toString((int)highPriceSpinner.getValue()) + "zl");
frame.getCanteen().setClientMaxAcceptableQueue(Double.parseDouble(Integer.toString((int)longQueueSpinner.getValue())), Double.parseDouble(Integer.toString((int)longQueueSpinner.getValue()))+7);
paramList.add("Srednia maksymalna akceptowalna przez klienta dlugosc kolejki: " + Integer.toString((int)longQueueSpinner.getValue()) + "osob");
frame.getCanteen().setClientServiceTime(Double.parseDouble(Integer.toString((int)minServiceTimeSpinner.getValue())), Double.parseDouble(Integer.toString((int)maxServiceTimeSpinner.getValue())));
paramList.add("Czas obslugi klienta: " + Integer.toString((int)minServiceTimeSpinner.getValue()) + "-" + Integer.toString((int)maxServiceTimeSpinner.getValue()) + "s");
frame.getCanteen().setMealEatTime(Double.parseDouble(Integer.toString((int)minEatTimeSpinner.getValue())),Double.parseDouble(Integer.toString((int)maxEatTimeSpinner.getValue())));
paramList.add("Czas jedzenia posilku: " + Integer.toString((int)minEatTimeSpinner.getValue()) + "-" + Integer.toString((int)maxEatTimeSpinner.getValue()) + "min");
frame.getCanteen().setMealPrepareTime(Double.parseDouble(Integer.toString((int)minFoodPrepareTimeSpinner.getValue())), Double.parseDouble(Integer.toString((int)maxFoodPrepareTimeSpinner.getValue())));
paramList.add("Czas przygotowania posilku: " + Integer.toString((int)minFoodPrepareTimeSpinner.getValue()) + "-" + Integer.toString((int)maxFoodPrepareTimeSpinner.getValue()) + "min");
frame.getCanteen().setCanteenAveragePrice(Double.parseDouble(Integer.toString((int)mealPriceSpinner.getValue())));
paramList.add("Srednia cena dan w stolowce: " + Integer.toString((int)mealPriceSpinner.getValue()) + "zl");
frame.getCanteen().setMinMealCount((int)minValueIngredientSpinner.getValue());
paramList.add("Minimalna wartosc skladnika: " + (int)minValueIngredientSpinner.getValue());
for (int i=0;i<(int)table2Spinner.getValue();i++)
frame.getCanteen().addTable2();
for (int i=0;i<(int)table4Spinner.getValue();i++)
frame.getCanteen().addTable4();
System.out.println("Watek wystartowany");
frame.getCanteen().setMyFrame(frame);
canteenThread.start();
frame.getAnimPanel().drawPanel();
}
}
);
}
public LinkedList<String> getParamList()
{
return paramList;
}
}