Veo varias inconsistencias.
Por ejemplo, dentro del ActionPerformed, encontramos estas líneas:
ClsFraccion resultado=new ClsFraccion();
Archivo file = new Archivo();
BtnGuardar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent eventoAccion) {
GuardarArchivo(eventoAccion);
}
});
Sobre la segunda línea, marcada en negrita:
ClsFraccion resultado=new ClsFraccion();
Archivo file = new Archivo();
BtnGuardar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent eventoAccion) {
GuardarArchivo(eventoAccion);
}
});
Creas un nuevo objeto Archivo llamado
file, pero luego parece que no haces nada con él.
Luego, la siguiente parte:
ClsFraccion resultado=new ClsFraccion();
Archivo file = new Archivo();
BtnGuardar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent eventoAccion) {
GuardarArchivo(eventoAccion);
}
});
Al botón guardar le agregas un ActionListener, pero esto es raro porque lo haces dentro del código del actionPerformed principal.
Es decir, cada vez que se clicka un botón, añades un ActionListener al botón guardar.
Estos ActionListener se van acumulando, ya que un botón, o cualquier otro objeto Swing, puede contener varios Listener. Así que si tras pulsar, no se... 8 botones y luego se pulsa el botón Guardar, se va a ejecutar 8 veces el mismo ActionListener, ya que están agregados a dicho botón.
Lo normal sería que le añadas el ActionListener, una sola vez, y esto se haga al iniciarse la aplicación.
Si lo que pretendes es que el botón Guardar no haga nada, hasta que previamente se hayan pulsado otros botones, esto lo puedes hacer con el método setEnabled() y pasarle true o false, según si quieres activar o desactivar el botón.
Y sobre ese ActionListener que le añades, consiste en el método llamado GuardarArchivo().
Que si observamos su código, atento a la línea en negrita:
private void GuardarArchivo(ActionEvent evt) {
ClsFraccion c = new ClsFraccion();
try {
FileWriter fw = new FileWriter("Calculadora.txt");
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter pw = new PrintWriter(bw);
pw.print(c.getResultado());
pw.close();
bw.close();
}catch(java.io.IOException ioex) {
JOptionPane.showMessageDialog(null, ioex.toString());
}
}
Lo primero que hace es crear un nuevo objeto ClsFraccion, el cuál al ser nuevo, su numerador y denominador es 0. No tiene ninguna relación con los cómputos que hayas hecho anteriormente. Probablemente por eso te guarda null en el txt.
Más cosas.
En el método main principal, estás creando dos Calculadoras:
public static void main(String[] args) {
new Calculadora();
Calculadora c = new Calculadora();
}
Por lo tanto, se abren dos marcos JFrame al iniciar el programa.
No creo que sea eso lo que quieres, supongo que solo quieres una:
public static void main(String[] args) {
new Calculadora();
}
Y en el constructor de la Calculadora, sugiero que le añadas las dos líneas que marco en negrita:
add(panel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 400);
setLocationRelativeTo(null);
setVisible(true);
La primera hace que cuando cerremos el JFrame pulsando el aspa de cerrar ventana, entonces la aplicación debe terminar.
Si no lo indicamos, aunque el JFrame se cierre y ya no sea visible, en realidad el programa sigue funcionando... solo que sin un JFrame con el que poder interactuar.
La segunda línea hace que la ventana de aplicación aparezca en el centro de la pantalla, y no en una esquina.
Luego a parte, tienes un montón de imports y atributos (como un array de bytes) que no se están usando para nada y supongo que son restos de andar copiando código de otros ejemplos.
En fin, al no ser mi programa, y no tener muy claro cómo debe funcionar esto de las fracciones, no se bien como se debe arreglar para que quede correcto.
Si he podido pulirlo un poco y conseguir que ya no imprima null, aunque el resultado que se imprime no estoy seguro de si es correcto. Eso ya tendrás que revisarlo tú.
Bien, he eliminado varios import y atributos que no se usan. He dejado un par por si quizás son botones que luego quieras añadir más adelante a la interfaz, no lo se...
Por cierto, siempre recomendable (por no decir obligatorio) señalar como private los atributos de clase, a no ser que realmente necesitemos que sean public.
Marcar como private sirve, entre otras cosas, para detectar atributos que nos sobran, ya que entonces el compilador que estemos usando suele avisar de que hay atributos que no estamos dando uso.
El objeto ClsFracccion que llamas
resultado, recomiendo declararlo como atributo de clase, y no como un objeto que se genera nuevo cada vez que se pulsa una acción.
Al botón Guardar, le vamos a escribir su propia clase ActionListener y se la añadiremos, una sola vez, en el constructor de la clase Calculadora.
Esta acción ejecutará el mismo código que escribiste tú en el método GuardarArchivo (ahora este método desaparece, porque se convierte directamente en un ActionListener), solo que esta vez tomará el
getResultado(), del ClsFraccion llamado
resultado que hemos declarado como atributo de clase.
La clase Archivo, no parece ser necesaria, al menos no tal y como está implementado el resto del código, yo ni siquiera la he añadido al proyecto que he creado.
Te dejo el código de Calculadora como lo tengo ahora, y marco en negrita los principales cambios.
Ahora ya imprime un resultado en el archivo de texto, pero no tengo claro si es un resultado correcto o no. A ver si a partir de aquí puedes seguir refinándolo.
Fíjate sobre todo que ahora el método GuardarArchivo(), se ha transformador en una clase ActionListener llamada
AccionGuardar. Y que esta acción se la añadimos al botón guardar dentro del constructor de Calculadora
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.PrintWriter;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public final class Calculadora extends JFrame implements ActionListener {
private JLabel eti1, guion1, guion2, ig, guion3, txtresn, txtresd;
private JTextField txtvalores, txtnum1, txtden1, txtnum2, txtden2;
private JButton BtnSuma, BtnResta, BtnMulti, BtnDiv, BtnIgual, BtnNumerador, BtnDenominador, BtnDEL, BtnDecimal,BtnGuardar,BtnAbrir;
private JPanel panel;
private ClsFraccion resultado;
public Calculadora(){
resultado = new ClsFraccion();
eti1 = new JLabel("Calculadora de Fracciones");
eti1.setBounds(128, 35, 200, 10);
//txtvalores = new JTextField();
//txtvalores.setBounds(58, 70, 280, 20);
txtnum1 = new JTextField();
txtnum1.setBounds(130, 60, 20, 20);
guion1= new JLabel("_");
guion1.setBounds(130, 70, 30, 20);
txtden1= new JTextField();
txtden1.setBounds(130, 90, 20, 20);
txtnum2 = new JTextField();
txtnum2.setBounds(160, 60, 20, 20);
guion2= new JLabel("_");
guion2.setBounds(160, 70, 30, 20);
txtden2= new JTextField();
txtden2.setBounds(160, 90, 20, 20);
ig= new JLabel("=");
ig.setBounds(190, 76, 20, 20);
txtresn= new JLabel();
txtresn.setBounds(210, 70, 20, 20);
txtresd= new JLabel();
txtresd.setBounds(210, 90, 20, 20);
guion3= new JLabel("_");
guion3.setBounds(210, 70, 30, 20);
BtnNumerador = new JButton("Num");
BtnNumerador.setBounds(60, 110, 90, 20);
BtnDenominador = new JButton("Den");
BtnDenominador.setBounds(230, 110, 90, 20);
BtnSuma = new JButton("+");
BtnSuma.setBounds(100, 150, 60, 20);
BtnSuma.addActionListener(this);
BtnResta = new JButton("-");
BtnResta.setBounds(220, 150, 60, 20);
BtnResta.addActionListener(this);
BtnMulti = new JButton("x");
BtnMulti.setBounds(100, 200, 60, 20);
BtnMulti.addActionListener(this);
BtnDiv = new JButton("/");
BtnDiv.setBounds(220, 200, 60, 20);
BtnDiv.addActionListener(this);
BtnIgual = new JButton("=");
BtnIgual.setBounds(100, 250, 60, 20);
BtnDEL = new JButton("DEL");
BtnDEL.setBounds(220, 250, 60, 20);
BtnGuardar= new JButton("Guardar");
BtnGuardar.addActionListener(new AccionGuardar());
BtnGuardar.setBounds(140, 290, 100, 20);
BtnAbrir= new JButton("Abrir");
BtnAbrir.setBounds(180, 290, 100, 20);
panel = new JPanel();
panel.setLayout(null);
panel.add(eti1);
//panel.add(txtvalores);
panel.add(txtnum1);
panel.add(guion1);
panel.add(txtden1);
panel.add(txtnum2);
panel.add(guion2);
panel.add(txtden2);
panel.add(txtresn);
panel.add(txtresd);
panel.add(guion3);
panel.add(ig);
//panel.add(BtnNumerador);
//panel.add(BtnDenominador);
panel.add(BtnSuma);
panel.add(BtnResta);
panel.add(BtnMulti);
panel.add(BtnDiv);
//panel.add(BtnIgual);
//panel.add(BtnDEL);
panel.add(BtnGuardar);
add(panel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 400);
setLocationRelativeTo(null);
setVisible(true);
}//cerrar calculadora
public static void main(String[] args) {
new Calculadora();
}
public void actionPerformed(ActionEvent e) {
//System.out.println("A");
String sx1, sx2, sy1, sy2;
int mcd, aux;
sx1=txtnum1.getText();
sx2=txtnum2.getText();
sy1=txtden1.getText();
sy2=txtden2.getText();
ClsFraccion f1=new ClsFraccion(Integer.parseInt(sx1), Integer.parseInt(sy1));
ClsFraccion f2=new ClsFraccion(Integer.parseInt(sx2), Integer.parseInt(sy2));
if(e.getSource()==BtnSuma) {
System.out.println("Suma");
resultado=resultado.suma(f1, f2);
mcd=resultado.mcdRecursivo(resultado.getNumerador(), resultado.getDenominador());
txtresn.setText(String.valueOf(resultado.getNumerador()/mcd));
txtresd.setText(String.valueOf(resultado.getDenominador()/mcd));
resultado.Imprimir();
}
if(e.getSource()==BtnResta) {
System.out.println("Resta");
resultado=resultado.resta(f1, f2);
mcd=resultado.mcdRecursivo(resultado.getNumerador(), resultado.getDenominador());
txtresn.setText(String.valueOf(resultado.getNumerador()/mcd));
txtresd.setText(String.valueOf(resultado.getDenominador()/mcd));
}
if(e.getSource()==BtnDiv) {
System.out.println("Division");
resultado=resultado.division(f1, f2);
mcd=resultado.mcdRecursivo(resultado.getNumerador(), resultado.getDenominador());
txtresn.setText(String.valueOf(resultado.getNumerador()/mcd));
txtresd.setText(String.valueOf(resultado.getDenominador()/mcd));
resultado.Imprimir();
}
if(e.getSource()==BtnMulti) {
System.out.println("Multiplicacion");
resultado=resultado.mul(f1, f2);
mcd=resultado.mcdRecursivo(resultado.getNumerador(), resultado.getDenominador());
txtresn.setText(String.valueOf(resultado.getNumerador()/mcd));
txtresd.setText(String.valueOf(resultado.getDenominador()/mcd));
resultado.Imprimir();
}}
private class AccionGuardar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
try {
FileWriter fw = new FileWriter("Calculadora.txt");
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter pw = new PrintWriter(bw);
pw.print(resultado.getResultado());
pw.close();
bw.close();
}catch(java.io.IOException ioex) {
JOptionPane.showMessageDialog(null, ioex.toString());
}
}
}
}