Gestione degli eventi in Java

di il
2 risposte

Gestione degli eventi in Java

Salve a tutti,
Ho iniziato da poco con le interfacce grafiche in java e con gli eventi e sto facendo un programma per la conversione della temperatura.
Il problema è che una volta inseriti i valori nelle JTextField non riesce a calcolarmi nessun valore delle temperature (inoltre deve farlo non solo da un unità di misura alle altre, ma varia a seconda della cella in quale do l'input), ho fatto i metodi di conversione in una classe separata da quella 'Ascoltatore', e mi sto scontrando con un problema nel costruttore dentro il metodo 'actionPerformed' dal quale non riesco ad uscirne.

Avevo risolto inserendo le formule di conversione direttamente nella classe 'Ascoltatore', ma ho deciso di fare una classe a parte per non avere un codice troppo lungo nel metodo 'actionPerformed'.
Ecco le 2 classi :

Classe Conversione

public class Conversione {

    private double celsius;
    private double fahrenheit;
    private double kelvin;
    private double rankine;
    private double k = 273.15;
    private double r = 491.67;

    public Conversione(double celsius, double fahrenheit, double kelvin, double rankine) {
        this.celsius = celsius;
        this.fahrenheit = fahrenheit;
        this.kelvin = kelvin;
        this.rankine = rankine;
    }

    public Conversione(double celsius) {
        this.celsius = celsius;
    }

    public void convertiDaCelsius() {
        fahrenheit = (9 / 5 * celsius) + 32;
        kelvin = (celsius + k);
        rankine = (float) ((celsius * 1.8) + r);
    }

    public void convertiDaFahrenheit() {
        celsius = (fahrenheit - 32) / 1.8;
        kelvin = (fahrenheit + 459.67) / 1.8;
        rankine = (fahrenheit - 31) + 491.67;
    }

    public void convertiDaKelvin() {
        celsius = kelvin - k;
        fahrenheit = ((k * 1.8) - 459.67);
        rankine = kelvin * 1.8;

    }

    public void convertiDaRankine() {
        celsius = (rankine - r) * (5 / 9);
        fahrenheit = (rankine - r) + 32;
        kelvin = ((rankine - r) / 1.8) + k;

    }

    @Override
    public String toString() {
        return celsius + "";
    }

    public String getCelsius() {
        return celsius + "";
    }

    public String getFahrenheit() {
        return fahrenheit + "";
    }

    public String getKelvin() {
        return kelvin + "";
    }

    public String getRankine() {
        return rankine + "";
    }

}


Classe Ascoltatore

public class Ascoltatore implements ActionListener {

    String vuota = " ";

    private JTextField cels;
    private JTextField fahr;
    private JTextField kelv;
    private JTextField rank;

    private Conversione cv;
    

    public Ascoltatore(JTextField cels, JTextField fahr, JTextField kelv, JTextField rank) {
        this.cels = cels;
        this.fahr = fahr;
        this.kelv = kelv;
        this.rank = rank;
    }

    @Override
    public void actionPerformed(ActionEvent ae) {

        if (ae.getActionCommand().equalsIgnoreCase("Calcola")) {
            cv = new Conversione(
                    Double.parseDouble(this.cels.getText()),
                    Double.parseDouble(this.fahr.getText()),
                    Double.parseDouble(this.kelv.getText()),
                    Double.parseDouble(this.rank.getText()));

            if (cels.getText().equalsIgnoreCase(vuota) && fahr.getText().equalsIgnoreCase(vuota)
                    && kelv.getText().equalsIgnoreCase(vuota)) {
                cv.convertiDaRankine();

                cels.setText(cv.getCelsius());
                fahr.setText(cv.getFahrenheit());
                kelv.setText(cv.getKelvin());
            }

            if (cels.getText().equalsIgnoreCase(vuota) && fahr.getText().equalsIgnoreCase(vuota)
                    && rank.getText().equalsIgnoreCase(vuota)) {
                cv.convertiDaKelvin();

                cels.setText(cv.getCelsius());
                fahr.setText(cv.getFahrenheit());
                rank.setText(cv.getRankine());
            }

            if (cels.getText().equalsIgnoreCase(vuota) && kelv.getText().equalsIgnoreCase(vuota)
                    && rank.getText().equalsIgnoreCase(vuota)) {
                cv.convertiDaFahrenheit();

                cels.setText(cv.getCelsius());
                kelv.setText(cv.getKelvin());
                rank.setText(cv.getRankine());
            }

            if (fahr.getText().equalsIgnoreCase(vuota) && kelv.getText().equalsIgnoreCase(vuota)
                    && rank.getText().equalsIgnoreCase(vuota)) {
                cv.convertiDaCelsius();

                fahr.setText(cv.getFahrenheit());
                kelv.setText(cv.getKelvin());
                rank.setText(cv.getRankine());

            }

        } else if (ae.getActionCommand().equalsIgnoreCase("Reset")) {

            this.cels.setText(vuota);
            this.fahr.setText(vuota);
            this.kelv.setText(vuota);
            this.rank.setText(vuota);

        }

    }
}

2 Risposte

  • Re: Gestione degli eventi in Java

    Raul_1706 ha scritto:


    ho deciso di fare una classe a parte per non avere un codice troppo lungo nel metodo 'actionPerformed'.
    A dire il vero, il fatto di evitare codice lungo nel actionPerformed lo si può fare in svariati modi, cercando di evitare duplicazioni e ragionando anche meglio a livello di "design" delle classi.
    Conta un po': quante volte ripeti esattamente la riga cels.setText(cv.getCelsius()); ? Al momento 3 volte. È una ripetizione, e non va bene.

    Inoltre per risolvere bene, detto in generale, la logica delle conversioni, sarebbe molto utile sfruttare la ereditarietà/polimorfismo: creare una classe base astratta es. TemperatureUnit con i metodi astratti di conversione es. toCelsius, toFahrenheit e poi sotto-classi "concrete" es. CelsiusTemperatureUnit che implementano questi metodi. A quel punto "switchare" sulla appropriata implementazione in base al campo in cui sei .... può diventare davvero banale e "pulito".
  • Re: Gestione degli eventi in Java

    Ok grazie, per ora ho risolto così ma proverò a implementare ciò che mi hai detto !
Devi accedere o registrarti per scrivere nel forum
2 risposte