Volevo chiedere qualche consiglio su come poter migliorare il codice
Questo è il codice relativo al main
Mentre questo è il codice relativo alla gestione degli eventi
Più che altro la calcolatrice funziona solo non capisco perchè se eseguo in sequenza operazioni di moltiplicazione e divisione(sfruttando la proprietà associativa) non funziona bene tipo 6*4*2=48 per le moltiplicazioni e divisioni devo fare le operazioni due a due(per esempio 6*4 poi premere uguale = 24 e poi moltiplicare 24 per 2, e quindi non posso fare direttamente 6*4*2=48, mentre con addizione e sottrazione si), poi non capisco perchè se eseguo 3+2*5=13 non funziona bene...
Inoltre nel main posso fare Calcolatrice c = new Calcolatrice(); ma anche JFrame c = new Calcolatrice(); per il polimorfismo?
Inoltre non capisco perchè nel costruttore Calcolatrice(), posso fare ActionListener asc = new Event(this); come parametro gli passo l'oggetto corrente, ossia la calcolatrice per inizializzare il listener in quanto deve poter accedere alla mia applicazione, ma non capisco perchè Event sia di tipo ActionListener...
Grazie per gli eventuali consigli :)
Questo è il codice relativo al main
Codice:
import javax.swing.*;import java.awt.*;
import java.awt.event.*;
//la mia calcolatrice è un jframe(per polimorfismo) quindi siccome estendo la classe posso applicare tutti i metodi di jframe!!!
class Calcolatrice extends JFrame {
public JButton zero,uno,due,tre,quattro,cinque,sei,sette,otto,nove,div,molt,som,sotr,virgola,segno,uguale,radice,percent,definire,cancellaC,cancellaCE;
public JLabel etichetta;
public String cont = "";
public double accumulatore = 0;
public double salvauno=0;
public double totale;
public Object o;
//inserire una variabile temporanea che contiene il valore attuale prima dell'eventuale operazione
//public seconda,prima;
//costruttore
public Calcolatrice() {
super("Calcolatrice"); //invoca costruttore di JFrame
ActionListener asc = new Event(this);
this.setSize(320,300);// il this si riferisce all'oggetto corrente ossia la calcolatrice
this.setMinimumSize(new Dimension(320,300));
this.setMaximumSize(new Dimension(500,500));
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(true);
this.inizializzaGUI();
this.zero.addActionListener(asc);
this.uno.addActionListener(asc);
this.due.addActionListener(asc);
this.tre.addActionListener(asc);
this.quattro.addActionListener(asc);
this.cinque.addActionListener(asc);
this.sei.addActionListener(asc);
this.sette.addActionListener(asc);
this.otto.addActionListener(asc);
this.nove.addActionListener(asc);
this.som.addActionListener(asc);
this.uguale.addActionListener(asc);
this.molt.addActionListener(asc);
this.div.addActionListener(asc);
this.sotr.addActionListener(asc);
this.cancellaC.addActionListener(asc);
this.radice.addActionListener(asc);
this.setVisible(true);
}
public void inizializzaGUI() {
Container c = this.getContentPane(); //il this è un riferimento all'oggetto di tipo JFrame
c.setLayout(new GridLayout(6,1));
JPanel tasti3; //pannello secondario per i tasti
JPanel tasti4;
JPanel tasti5;
JPanel tasti6;
JPanel cancella; //pannello secondario per cancellare
// costruzione dei tre pannelli col rispettivo layout
tasti3 = new JPanel(new GridLayout(1,5));
tasti4 = new JPanel(new GridLayout(1,5));
tasti5 = new JPanel(new GridLayout(1,5));
tasti6 = new JPanel(new GridLayout(1,5));
cancella = new JPanel(new GridLayout(1,2));
//assegnazione componenti
etichetta = new JLabel("0");
cancellaC = new JButton("C");
cancellaCE = new JButton("CE");
zero = new JButton("0");
uno = new JButton("1");
due = new JButton("2");
tre = new JButton("3");
quattro = new JButton("4");
cinque = new JButton("5");
sei = new JButton("6");
sette = new JButton("7");
otto = new JButton("8");
nove = new JButton("9");
div = new JButton("/");
molt = new JButton("*");
som = new JButton("+");
sotr = new JButton("-");
virgola = new JButton(".");
segno = new JButton("+/-");
uguale = new JButton("=");
radice = new JButton("sqrt");
percent = new JButton("%");
definire = new JButton("1/x");
//aggiunta dei vari componenti
cancella.add(cancellaCE);
cancella.add(cancellaC);
tasti3.add(sette);
tasti3.add(otto);
tasti3.add(nove);
tasti3.add(div);
tasti3.add(radice);
tasti4.add(quattro);
tasti4.add(cinque);
tasti4.add(sei);
tasti4.add(molt);
tasti4.add(percent);
tasti5.add(uno);
tasti5.add(due);
tasti5.add(tre);
tasti5.add(sotr);
tasti5.add(definire);
tasti6.add(zero);
tasti6.add(segno);
tasti6.add(virgola);
tasti6.add(som);
tasti6.add(uguale);
//aggiunta dei vari pannelli al ContentPane
c.add(etichetta);
c.add(cancella);
c.add(tasti3);
c.add(tasti4);
c.add(tasti5);
c.add(tasti6);
}
public void mostrazero() {
etichetta.setText(this.cont+"0");
this.cont = this.cont+"0";
this.accumulatore = Integer.parseInt(this.cont);
}
public void mostrauno() {
etichetta.setText(this.cont+"1");
this.cont = this.cont+"1";
this.accumulatore = Integer.parseInt(this.cont);
}
public void mostradue() {
etichetta.setText(this.cont+"2");
this.cont = this.cont+"2";
this.accumulatore = Integer.parseInt(this.cont);
}
public void mostratre() {
etichetta.setText(this.cont+"3");
this.cont = this.cont+"3";
this.accumulatore = Integer.parseInt(this.cont);
}
public void mostraquattro() {
etichetta.setText(this.cont+"4");
this.cont = this.cont+"4";
this.accumulatore = Integer.parseInt(this.cont);
}
public void mostracinque() {
etichetta.setText(this.cont+"5");
this.cont = this.cont+"5";
this.accumulatore = Integer.parseInt(this.cont);
}
public void mostrasei() {
etichetta.setText(this.cont+"6");
this.cont = this.cont+"6";
this.accumulatore = Integer.parseInt(this.cont);
}
public void mostrasette() {
etichetta.setText(this.cont+"7");
this.cont = this.cont+"7";
this.accumulatore = Integer.parseInt(this.cont);
}
public void mostraotto() {
etichetta.setText(this.cont+"8");
this.cont = this.cont+"8";
this.accumulatore = Integer.parseInt(this.cont);
}
public void mostranove() {
etichetta.setText(this.cont+"9");
this.cont = this.cont+"9";
this.accumulatore = Integer.parseInt(this.cont);
}
public void operazioni(Object t) { //vale per qualsiasi operazione;
etichetta.setText("0");
this.cont = "";
salvauno = totale+this.accumulatore;
System.out.println(this.accumulatore);
System.out.println(this.salvauno);
this.accumulatore = 0;
o = t;
}
public void calcola() {
if(o==this.som) {
totale = salvauno+this.accumulatore;
etichetta.setText(String.valueOf(totale));
}
else if (o==this.molt) {
totale = salvauno*this.accumulatore;
etichetta.setText(String.valueOf(totale));
}
else if (o==this.div) {
totale = salvauno/this.accumulatore;
etichetta.setText(String.valueOf(totale));
}
else if (o==this.sotr) {
totale = salvauno-this.accumulatore;
etichetta.setText(String.valueOf(totale));
}
else if (o==this.radice) {
totale = Math.sqrt(this.accumulatore);
etichetta.setText(String.valueOf(totale));
}
this.accumulatore=0;
}
public void azzera() {
etichetta.setText("0");
this.cont="";
this.accumulatore = 0;
this.salvauno = 0;
this.totale = 0;
}
public static void main(String[] args) {
Calcolatrice c = new Calcolatrice(); //per polimorfismo posso anche fare JFrame c =...
}
}
Codice:
import java.awt.event.*;class Event implements ActionListener {
//l'ascoltatore deve accedere all'applicazione
private Calcolatrice pib;
//inizializzo l'oggetto Listener
public Event(Calcolatrice c) {
this.pib = c;
}
//capisce quale evento accade e se accate tale evento fa partire il metodo
public void actionPerformed(ActionEvent e) {
if (e.getSource()==this.pib.zero)
this.pib.mostrazero();
else if (e.getSource()==this.pib.uno)
this.pib.mostrauno();
else if (e.getSource()==this.pib.due)
this.pib.mostradue();
else if (e.getSource()==this.pib.tre)
this.pib.mostratre();
else if (e.getSource()==this.pib.quattro)
this.pib.mostraquattro();
else if (e.getSource()==this.pib.cinque)
this.pib.mostracinque();
else if (e.getSource()==this.pib.sei)
this.pib.mostrasei();
else if (e.getSource()==this.pib.sette)
this.pib.mostrasette();
else if (e.getSource()==this.pib.otto)
this.pib.mostraotto();
else if (e.getSource()==this.pib.nove)
this.pib.mostranove();
else if (e.getSource()==this.pib.som || e.getSource()==this.pib.molt || e.getSource()==this.pib.div || e.getSource()==this.pib.sotr || e.getSource()==this.pib.radice)
this.pib.operazioni(e.getSource());
else if (e.getSource()==this.pib.uguale)
this.pib.calcola();
else if (e.getSource()==this.pib.cancellaC)
this.pib.azzera();
}
}
Inoltre nel main posso fare Calcolatrice c = new Calcolatrice(); ma anche JFrame c = new Calcolatrice(); per il polimorfismo?
Inoltre non capisco perchè nel costruttore Calcolatrice(), posso fare ActionListener asc = new Event(this); come parametro gli passo l'oggetto corrente, ossia la calcolatrice per inizializzare il listener in quanto deve poter accedere alla mia applicazione, ma non capisco perchè Event sia di tipo ActionListener...
Grazie per gli eventuali consigli :)