Kalkulator - problem z GUI

0

Witam!
Napisałem sobie prosty kalkulator z wykorzystaniem swing'a. No ale jest problem z obsługą kilku zdarzeń a mianowicie chodzi tu o takie przyciski jak "plus" "minus" "równa się" etc. Tutaj zamieszczam kawałek kodu z którym nie moge sobie poradzić(Opisałem to w komentarzach).

Java:

public void actionPerformed(ActionEvent e){
        String sl = ((JButton)e.getSource()).getLabel();
        if(sl == "1") setNumber(1);
        else if(sl == "2") setNumber(2);
        else if(sl == "3") setNumber(3);
        else if(sl == "4") setNumber(4);
        else if(sl == "5") setNumber(5);
        else if(sl == "6") setNumber(6);
        else if(sl == "7") setNumber(7);
        else if(sl == "8") setNumber(8);
        else if(sl == "9") setNumber(9);
        else if(sl == "0") setNumber(0);
        else if(sl == "C"){
                engine.setReady(false);
                resultField.setText("0");
        }
        else if(sl == "+") setFunction(engine.ADD);
        else if(sl == "-") setFunction(engine.SUB);
        else if(sl == "/") setFunction(engine.DIV);
        else if(sl == "X") setFunction(engine.MUL);
        else if(sl == "="){     
                // TODO nie mam pojęcia :/
        }
        else if(sl == "+/-"){
                resultField.setText(String.valueOf(-getNumber()));
        }
}
               
private void setNumber(int n){
        if(clear){
                resultField.setText("");
        }
               
        if(resultField.getText().equals("0")){
                resultField.setText(String.valueOf(n));
        }
        else{
                String num = resultField.getText()+String.valueOf(n);
                if(num.substring(num.length()-1) == "0"){
                        resultField.setText(num.substring(0,num.length()-1));
                }
                else{
                        resultField.setText(num);
                }
        }
                       
        clear = false;
}
               
private double getNumber(){
        if(resultField.getText().equals("")) return 0;
        else return Double.valueOf(resultField.getText());
}
               
private void setFunction(State op){
                       
        /* TODO
         * W tej funkcji chodzi o to żeby:
         * 1. Wprowadzam liczbę i wybieram operację
         * 2. Wprowadzam liczbę i wybieram drugą operację
         * 3. Wyświetlam poprzedni wynik i wprowadzam nastepną liczbę
         * Ale: z moim kodem coś jest nie tak bo:
         * Klikam np. na + to podwaja mi wartość pola engine.a
         *
         */
                       
        if(engine.isReady()){
                engine.setB(getNumber());
                resultField.setText(String.valueOf(engine.getResult()));
                engine.setReady(false);
        }else{
                engine.setA(getNumber());
                engine.setReady(true);
        }

        engine.setOperation(op);
        clear = true;
}

Propo przycisku "równa się":

Java:

...
else if(sl == "="){

    }

....

To chodzi o to żeby:

  1. Wpisuje sobie liczbę.
  2. Wybieram sobie operację np +.
  3. Wybieram drugą liczbę.
  4. Wybieram =.
  5. I teraz jeśli ponownie wybiorę = to powinienem otrzymać poprzedni_wynik+druga_liczba tak jak w normalnym kalkulatorze.

Czy ktoś potrafi to rozgryźć? Podpowiedzcie jak sie za to zabrać.

pzdr.

PS. A co myślicie o zastosowaniu tutaj wzorca Stanu??. Czy on pasuje do tej aplikacji i czy ułatwi to możliwość konserwacji programu?? Cały kod jest tutaj http://www.box.net/shared/u1epi4qkk0

0

Porównujesz referencje? Zamiast zmienna == "napis" powinieneś napisać "napis".equals(zmienna).

0

Zastosowanie == w tym przypadku jest nieistotne. Pytam ponownie: Jak oprogramować przyciski operacji?

0
xmoon napisał(a)

PS. A co myślicie o zastosowaniu tutaj wzorca Stanu??. Czy on pasuje do tej aplikacji i czy ułatwi to możliwość konserwacji programu??

Wzorzec strategii (strategy pattern) bylby tutaj bardziej na miejscu, chociaz roznica miedzy nimi jest raczej subtelna. Wprawdzie aplikacja nie jest jakos szczegolnie skomplikowana, ale podejscie jest prawidlowe. Dodatkowo wykorzystac typy wyliczeniowe (enum) i mozna z tego zrobic calkiem przyjemny kawalek kodu.

PS. sluchaj donkey7, bo dobrze Ci radzi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1