<repo_name>PolluxTechnologies/QPMtool<file_sep>/QueuePerformanceMeasures/src/frame/Wireframe2.java
package frame;

import java.awt.*;
import java.awt.event.*;
import java.util.HashMap;
import java.util.Map;

import javax.swing.*;

//Wireframe2
public class Wireframe2 extends JPanel implements ActionListener{

	static String buttonCalcString = "Calculate";
	static String lambdaString = "Lambda";
	
	//Objetos dentro del panel Wireframe2
	JPanel titlePanel, labelPanel, textFieldPanel, centralPanel, lambdaPanel, muPanel;
	JTextArea textf;
	JButton buttonCalc;
	JLabel lambdaLabel, muLabel, serversLabel, capacityLabel, varianceLabel, cvarrivalsLabel, cvserviceLabel;
	JTextField lambdaTf, muTf, varianceTf, cvarrivalsTf, cvserviceTf;
	JSpinner serverSpinner, capacitySpinner;

    public static JComponent getTwoColumnLayout(
            JLabel[] labels,
            JComponent[] fields,
            boolean addMnemonics) {
        if (labels.length != fields.length) {
            String s = labels.length + " labels supplied for "
                    + fields.length + " fields!";
            throw new IllegalArgumentException(s);
        }
        JComponent panel = new JPanel();
        GroupLayout layout = new GroupLayout(panel);
        panel.setLayout(layout);
        // Turn on automatically adding gaps between components
        layout.setAutoCreateGaps(true);
        // Create a sequential group for the horizontal axis.
        GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
        GroupLayout.Group yLabelGroup = layout.createParallelGroup(GroupLayout.Alignment.TRAILING);
        hGroup.addGroup(yLabelGroup);
        GroupLayout.Group yFieldGroup = layout.createParallelGroup();
        hGroup.addGroup(yFieldGroup);
        layout.setHorizontalGroup(hGroup);
        // Create a sequential group for the vertical axis.
        GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
        layout.setVerticalGroup(vGroup);

        int p = GroupLayout.PREFERRED_SIZE;
        // add the components to the groups
        for (JLabel label : labels) {
            yLabelGroup.addComponent(label);
        }
        for (Component field : fields) {
            yFieldGroup.addComponent(field, p, p, p);
        }
        for (int ii = 0; ii < labels.length; ii++) {
            vGroup.addGroup(layout.createParallelGroup().
                    addComponent(labels[ii]).
                    addComponent(fields[ii], p, p, p));
        }

        if (addMnemonics) {
            addMnemonics(labels, fields);
        }

        return panel;
    }

    private final static void addMnemonics(
            JLabel[] labels,
            JComponent[] fields) {
        Map<Character, Object> m = new HashMap<Character, Object>();
        for (int ii = 0; ii < labels.length; ii++) {
            labels[ii].setLabelFor(fields[ii]);
            String lwr = labels[ii].getText().toLowerCase();
            for (int jj = 0; jj < lwr.length(); jj++) {
                char ch = lwr.charAt(jj);
                if (m.get(ch) == null && Character.isLetterOrDigit(ch)) {
                    m.put(ch, ch);
                    labels[ii].setDisplayedMnemonic(ch);
                    break;
                }
            }
        }
    }
    
	public static JComponent getTwoColumnLayout(
            String[] labelStrings,
            JComponent[] fields) {
        JLabel[] labels = new JLabel[labelStrings.length];
        for (int ii = 0; ii < labels.length; ii++) {
            labels[ii] = new JLabel(labelStrings[ii]);
        }
        return getTwoColumnLayout(labels, fields);
    }
    
    public static JComponent getTwoColumnLayout(
            JLabel[] labels,
            JComponent[] fields) {
        return getTwoColumnLayout(labels, fields, true);
    }
    
	private Wireframe2(){
		//Crea la ventana
		JFrame jfrme = new JFrame("Queue Performance Measures");
		
		//Opciones por defecto de la ventana
		jfrme.setLayout(new FlowLayout());
		jfrme.setSize(380, 390);
		jfrme.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jfrme.getContentPane().setBackground(Color.WHITE);
		
		//Panel con el título
		titlePanel = new JPanel();
		titlePanel.setBorder(BorderFactory.createLineBorder(Color.black));
		titlePanel.setPreferredSize(new Dimension(340, 80));
		titlePanel.setLayout(new GridBagLayout());
		titlePanel.setBackground(Color.WHITE);
		textf= new JTextArea("Insert Parameters");
		textf.setEditable(false);
		textf.setFont(new Font("Arial", Font.PLAIN, 24));
		titlePanel.add(textf);
		
        JComponent[] components = {
                new JTextField(5),
                new JTextField(5),
                new JSpinner(new SpinnerNumberModel(1,1,20,1)),
                new JSpinner(new SpinnerNumberModel(1,1,20,1)),
                new JTextField(5),
                new JTextField(5),
                new JTextField(5)
            };

            String[] labels = {
                "Lambda:",
                "Mu:",
                "Number of servers:",
                "Capacity:",
                "Variance:",
                "CV for interarrival times:",
                "CV for service times:"
            };
            
		JComponent labelsAndFields = getTwoColumnLayout(labels,components);
		labelsAndFields.setBackground(Color.WHITE);	
		labelsAndFields.setPreferredSize(new Dimension(240, 190));
		labelPanel=new JPanel();
		labelPanel.setPreferredSize(new Dimension(25, 180));
		labelPanel.setBackground(Color.WHITE);
		centralPanel = new JPanel();
		
		buttonCalc = new JButton(buttonCalcString);
		
		jfrme.add(titlePanel);
		centralPanel.add(labelPanel);
		centralPanel.add(labelsAndFields, BorderLayout.CENTER);
		centralPanel.setBackground(Color.WHITE);
		
		jfrme.add(centralPanel);
		jfrme.add(buttonCalc);
		jfrme.setResizable(false);
		jfrme.setVisible(true);
	}
	
	public void actionPerformed(ActionEvent ae){
		
	}
	 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Wireframe2();
	}
}
<file_sep>/QueuePerformanceMeasures/src/QPM.java
//Clase abstracta que contiene tanto los parámetros de entrada como las medidas de desempeño
class Queue {

	//Parámetros de entrada
	double arrivalRate; //Tasa de entrada de los clientes al sistema
	//boolean arrivalM; //1 si el proceso de entradas es Markoviano, 0 de lo contrario
	double serviceRate; //Tasa de servicio de los servidores
	//boolean serviceM; //1 si el proceso de servicio es Markoviano, 0 de lo contrario
	//int numServers; //Número de servidores en paralelo
	//int capacity; //Máximo número de clientes que admite el sistema en un instante cualquiera
	//double varService; //Varianza en el tiempo de servicio
	//double cvArrival; //Coeficiente de variación al cuadrado de los tiempos entre arribos 
	//double cvService; //Coeficiente de variación al cuadrado de los tiempos de servicio
	
	//Medidas de desempeño
	//double eeL; //Número promedio de entidades en el sistema en estado estable
	//double eeLq; //Número promedio de entidades esperando en el sistema en estado estable
	//double eeLs; //Número promedio de entidades siendo atendidas en el sistema en estado estable
	//double eeW; //Tiempo promedio que demora un cliente en el sistema en estado estable
	//double eeWq; //Tiempo promedio que demora un cliente esperando en el sistema en estado estable
	//double eeWs; //Tiempo promedio que demora un cliente siendo atendido en el sistema en estado estable
	//double exitRate; //Tasa de salida efectiva de los clientes
	//double util; //Utilización del servidor
	//double pij; //Probabilidades en estado estable de que hayan j clientes en el sistema
	//double cvDeparture; //Coeficiente de variación al cuadrado de los tiempos entre salidas
	
	//Métodos
	void setArrivalRate(double lambda){arrivalRate=lambda;}
	void setServiceRate(double mu){serviceRate=mu;}
}

//Clase que define las propiedades de modelo de cola M/M/1
class mmOne extends Queue {
	
	//Constructor
	mmOne(double l, double m){//l Lambda: tasa de arribos, m Mu: tasa de servicios
		if(l/m >=1){//Verifico estabilidad
			throw new ArithmeticException();
		} else {//Si el sistema es estable realizo la asignación de parámetros
			setArrivalRate(l); //Tasa de arribos=lambda
			setServiceRate(m); //Tasa de servicios=mu
		}		
	}
	
	//Método cálculo de ocupación
	double util(){
		return arrivalRate/serviceRate;
	}
	
	//Método cálculo de L
	double eeL(){
		return util()/(1-util());
	}
	
	//Método cálculo de Lq
	double eeLq(){
		return Math.pow(util(), 2)/(1-util());
	}
	
	//Método cálculo de Ls
	double eeLs(){
		return eeL()-eeLq();
	}
	
	//Método cálculo de W
	double eeW(){
		return eeL()/arrivalRate;
	}
	
	//Método cálculo de Wq
		double eeWq(){
			return eeLq()/arrivalRate;
		}
		
	//Método cálculo de Ws
	double eeWs(){
		return eeLs()/arrivalRate;
	}
	
	double pij(int j){
		return Math.pow(util(),j)*(1-util());
	}
}


class QPM{
	public static void main(String[] args) {
		try{//Se verifica estabilidad del sistema
			mmOne line = new mmOne(4,4);
		
			System.out.println("La ocupación del servidor es " + line.util());
			System.out.println("Ws es " + line.eeWs());
			System.out.println("Ls prob en e.e. de 3 clientes en la línea es " + line.pij(3));
		}
		catch(ArithmeticException exc){//Si el sistema no estable devuelve un mensaje de error
			System.out.println("El sistema no es estable. Por favor verifique los parámetros ingresados.");
		}
	}
}<file_sep>/QueuePerformanceMeasures/src/frame/Wireframe3.java
package frame;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

//Wireframe1 
public class Wireframe3 extends Frame implements ActionListener{
    
	//Elementos dentro del panel Wireframe1
	JPanel titlePanel, dataPanel, pmPanel, probPanel, buttonPanel;
	JTextArea titleTextArea, dataTextArea, pmTextArea, probTextArea;
	JButton buttonChange, buttonSelect;
	
	//Textos estáticos
	static String dataString = "Data summary";
	static String pmString = "Performance measures";
    static String probString = "Probability distribution chart";
    static String buttonChangeString = "Change parameters";
    static String buttonSelectString = "Select another model";
    
    private Wireframe3() {
        //Crea la ventana
    	JFrame jfrm = new JFrame("Queue Performance Measures");
		
    	//Opciones por defecto de la ventana
		jfrm.setLayout(new FlowLayout());
		jfrm.setSize(380, 790);
		jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jfrm.getContentPane().setBackground(Color.WHITE);
		
		//Panel con el título
		titlePanel = new JPanel();
		titlePanel.setBorder(BorderFactory.createLineBorder(Color.black));
		titlePanel.setPreferredSize(new Dimension(340, 80));
		titlePanel.setLayout(new GridBagLayout());
		titlePanel.setBackground(Color.WHITE);
		
		titleTextArea = new JTextArea("Performance Measures");
		titleTextArea.setEditable(false);
		titleTextArea.setFont(new Font("Arial", Font.PLAIN, 24));
		titlePanel.add(titleTextArea);
		
        //Panel de resumen de información
        dataPanel = new JPanel();
        dataPanel.setPreferredSize(new Dimension(240, 180));
        dataPanel.setBackground(Color.WHITE);
        dataPanel.setBorder(BorderFactory.createTitledBorder(dataString));
    
        pmPanel = new JPanel();
        pmPanel.setPreferredSize(new Dimension(240, 180));
        pmPanel.setBackground(Color.WHITE);
        pmPanel.setBorder(BorderFactory.createTitledBorder(pmString));  
        
        probPanel = new JPanel();
        probPanel.setPreferredSize(new Dimension(240, 180));
        probPanel.setBackground(Color.WHITE);
        probPanel.setBorder(BorderFactory.createTitledBorder(probString)); 
        
        //Botón Change;
        buttonChange = new JButton(buttonChangeString);
        buttonChange.setPreferredSize(new Dimension(160, 30));
        buttonChange.addActionListener(this);
        
        //Botón Select;
        buttonSelect = new JButton(buttonSelectString);
        buttonSelect.setPreferredSize(new Dimension(160, 30));
        buttonSelect.addActionListener(this);
        
		
		//Panel para el botón
		buttonPanel = new JPanel();
		buttonPanel.setLayout(new GridBagLayout());
		buttonPanel.setBackground(Color.WHITE);
		buttonPanel.setPreferredSize(new Dimension(340, 50));
		buttonPanel.add(buttonChange);
		buttonPanel.add(buttonSelect);
		       
		//Añade elementos al Frame
		jfrm.add(titlePanel);
		jfrm.add(dataPanel);
		jfrm.add(pmPanel);
		jfrm.add(probPanel);
		jfrm.add(buttonPanel);
		jfrm.setResizable(false);
		
		//Hace visible el Frame
		jfrm.setVisible(true);
    }

	public void actionPerformed(ActionEvent ae){
		
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Wireframe3();

	}

}
