/*
* Principal.java
* Descripcion: Frame con los componentes gráficos del programa
* Autores:
* Alexander Bolaños 12114
* Ricardo Hegel 12232
*/
package hojatrabajo4;
import java.awt.Color;
import java.awt.FileDialog;
import java.io.BufferedReader;
import java.io.FileReader;
import java.text.DecimalFormat;
import java.util.StringTokenizer;
import javax.swing.JOptionPane;
/**
* Inicio de la clase
*/
public class Principal extends javax.swing.JFrame {
private Stack<Double> miStack = new StackVector<Double>();
private DecimalFormat formato = new DecimalFormat("0.0");
static int indice,indiceLista;
private Calculadora calculadora;
/**
* Constructor
*/
public Principal(int indice,int indiceLista) {
this.indice = indice;
this.indiceLista = indiceLista;
calculadora = calculadora.getInstance();
calculadora.crearStack(indice, indiceLista);
//initComponents posiciona todos los elementos gráficos, labels, botones, etc
initComponents();
//caracteristicas determina la personalizacion de ciertos componentes
caracteristicas();
}
/**
* initComponents contiene la declaración y clocaciónn de los elementos gráficos del frame
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jButton1 = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
jTextArea1 = new javax.swing.JTextArea();
jScrollPane2 = new javax.swing.JScrollPane();
jTextArea2 = new javax.swing.JTextArea();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jLabel4 = new javax.swing.JLabel();
jTextField1 = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(null);
jButton1.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
jButton1.setText("Seleccionar Archivo");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
getContentPane().add(jButton1);
jButton1.setBounds(400, 330, 160, 40);
jTextArea1.setColumns(20);
jTextArea1.setFont(new java.awt.Font("Times New Roman", 0, 12)); // NOI18N
jTextArea1.setForeground(new java.awt.Color(0, 0, 102));
jTextArea1.setRows(5);
jScrollPane1.setViewportView(jTextArea1);
getContentPane().add(jScrollPane1);
jScrollPane1.setBounds(30, 70, 430, 250);
jTextArea2.setColumns(20);
jTextArea2.setFont(new java.awt.Font("Times New Roman", 0, 12)); // NOI18N
jTextArea2.setForeground(new java.awt.Color(51, 102, 0));
jTextArea2.setRows(5);
jScrollPane2.setViewportView(jTextArea2);
getContentPane().add(jScrollPane2);
jScrollPane2.setBounds(480, 70, 430, 250);
jLabel1.setFont(new java.awt.Font("Calibri", 1, 36)); // NOI18N
jLabel1.setText("Calculadora:");
getContentPane().add(jLabel1);
jLabel1.setBounds(390, 10, 200, 30);
jLabel2.setFont(new java.awt.Font("Calibri", 0, 11)); // NOI18N
jLabel2.setText("Documento de Texto:");
getContentPane().add(jLabel2);
jLabel2.setBounds(30, 50, 120, 14);
jLabel3.setFont(new java.awt.Font("Calibri", 0, 11)); // NOI18N
jLabel3.setText("Operaciones:");
getContentPane().add(jLabel3);
jLabel3.setBounds(480, 50, 80, 14);
jLabel4.setFont(new java.awt.Font("Calibri", 0, 11)); // NOI18N
jLabel4.setText("Valores en el Stack:");
getContentPane().add(jLabel4);
jLabel4.setBounds(670, 350, 110, 14);
jTextField1.setFont(new java.awt.Font("Times New Roman", 0, 11)); // NOI18N
jTextField1.setForeground(new java.awt.Color(255, 0, 0));
jTextField1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTextField1ActionPerformed(evt);
}
});
getContentPane().add(jTextField1);
jTextField1.setBounds(780, 350, 80, 19);
pack();
}// </editor-fold>//GEN-END:initComponents
private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jTextField1ActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_jTextField1ActionPerformed
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
/*
* Obtengo el archivo, lo evalúo y si es un archivo de texto lo leo y analizo para poder operarlo
*/
String obtenido = obtenerArchivo();
if(!obtenido.equals("ERROR")){
boolean realizado = calcular(obtenido);
if(realizado)
JOptionPane.showMessageDialog(this,"Proceso finalizado satisfactoriamente.");
else
JOptionPane.showMessageDialog(this,"Se presentaron errores en el cálculo.");
}
}//GEN-LAST:event_jButton1ActionPerformed
/**
* main de la interfaz
*/
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Principal(indice,indiceLista).setVisible(true);
}
});
}
/*
* Este método obtiene el archivo que contiene los operadores.
*/
public String obtenerArchivo(){
jTextArea1.setText("");
jTextArea2.setText("");
String todo = "";
FileDialog fd= new FileDialog(this,"Abrrir archivo",FileDialog.LOAD);
fd.setVisible(true);
String nombreArchivo=fd.getFile();
String Directorio=fd.getDirectory();
int contador=1;
try{
BufferedReader arch= new BufferedReader(new FileReader(Directorio+nombreArchivo));
String lin;
do{
lin=arch.readLine();
if(lin!=null){
todo += lin+"\n";
jTextArea1.setText(jTextArea1.getText()+"LINEA "+contador+"||| "+lin+"\n");
contador++;
}
}while(lin!=null);
return todo;
}catch(Exception e){
JOptionPane.showMessageDialog(this,"Error al abrir el archivo, archivo no compatible");
return("ERROR");
}
}
/*
* Este metodo desarrolla la personalizacion de ciertos aspectos del JFrame
*/
public void caracteristicas(){
jTextArea1.setEditable(false);
jTextArea2.setEditable(false);
jTextField1.setEditable(false);
jButton1.setSize(150,40);
}
/*
* Este método divide la cadena en líneas, luego en columnas
*/
public boolean calcular(String todo){
int contador = 1;
boolean correcto=true;
StringTokenizer st = new StringTokenizer(todo,"\n");
while(st.hasMoreTokens()) {
jTextField1.setText("");
jTextArea2.setText(jTextArea2.getText()+"LINEA "+contador+"||| ");
contador++;
String linea = st.nextToken();
String operacion = calculadora.analizar(linea);
jTextArea2.setText(jTextArea2.getText()+operacion.substring(3));
if(operacion.substring(0,1).equals("1")){
Stack<String> miStack = calculadora.getMiStack();
Double necesario = Double.parseDouble(miStack.pop());
jTextField1.setText(formato.format(necesario));
calculadora.setMiStack(miStack);
}
else{
correcto=false;
if(operacion.substring(1,2).equals("0")){
String op;
if(operacion.substring(2,3).equals("0"))
op = "suma";
else if(operacion.substring(2,3).equals("1"))
op = "resta";
else if(operacion.substring(2,3).equals("2"))
op = "multiplicación";
else
op = "división";
JOptionPane.showMessageDialog(this,"Error en Operación: "
+ "Falta dos operandos para poder realizar una "+op+".");
Stack<String> miStack = calculadora.getMiStack();
int tam = miStack.size();
for(int i=0;i<tam;i++){
Double numero = Double.parseDouble(miStack.pop());
if(i==0)
jTextField1.setText(""+formato.format(numero));
else
jTextField1.setText(jTextField1.getText()+" , "+formato.format(numero));
}
}
else if(operacion.substring(1,2).equals("1")){
String op;
if(operacion.substring(2,3).equals("0"))
op = "suma";
else if(operacion.substring(2,3).equals("1"))
op = "resta";
else if(operacion.substring(2,3).equals("2"))
op = "multiplicación";
else
op = "división";
JOptionPane.showMessageDialog(this,"Error en Operación: "
+ "Falta un operando para poder realizar una "+op+".");
Stack<String> miStack = calculadora.getMiStack();
int tam = miStack.size();
for(int i=0;i<tam;i++){
Double numero = Double.parseDouble(miStack.pop());
if(i==0)
jTextField1.setText(""+formato.format(numero));
else
jTextField1.setText(jTextField1.getText()+" , "+formato.format(numero));
}
}
else if(operacion.substring(1,2).equals("2")){
JOptionPane.showMessageDialog(this,"Error en Operación: "
+ "Ingresó un símbolo incorrecto.");
Stack<String> miStack = calculadora.getMiStack();
int tam = miStack.size();
for(int i=0;i<tam;i++){
Double numero = Double.parseDouble(miStack.pop());
if(i==0)
jTextField1.setText(""+formato.format(numero));
else
jTextField1.setText(jTextField1.getText()+" , "+formato.format(numero));
}
}
else{
JOptionPane.showMessageDialog(this,"Error en Operación: "
+ "No se han operado la totalidad de números en el Stack.");
Stack<String> miStack = calculadora.getMiStack();
int tam = miStack.size();
for(int i=0;i<tam;i++){
Double numero = Double.parseDouble(miStack.pop());
if(i==0)
jTextField1.setText(""+formato.format(numero));
else
jTextField1.setText(jTextField1.getText()+" , "+formato.format(numero));
}
}
}
}
return correcto;
}
/*
* Declaraciónd de los atributos del grame, botones, labels, etc.
*/
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTextArea jTextArea1;
private javax.swing.JTextArea jTextArea2;
private javax.swing.JTextField jTextField1;
// End of variables declaration//GEN-END:variables
}