Pierwszy program okienkowy

0

Zamieszczam fragment mojego kodu kalkulatora

public Okno() {
		super("Kalkulator");
		setSize(200,250);
		setLocation(600,200);		
		setResizable(false);		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
		setVisible(true);
		panel = new JPanel(new GridLayout(4,5));
		screen = new JLabel(" "+wynik);
		panel.add(p0);
		panel.add(p1);
		panel.add(p2);
		panel.add(p3);
		panel.add(p4);
		panel.add(p5);
		panel.add(p6);
		panel.add(p7);
		panel.add(p8);
		panel.add(p9);
		panel.add(dodaj);
		panel.add(odejmij);
		panel.add(mnoz);
		panel.add(dziel);
		panel.add(kasuj);
		panel.add(suma);
		setLayout(new BorderLayout());
		add(BorderLayout.SOUTH, panel);
		add(BorderLayout.NORTH, screen);
		p0.addActionListener(this);
		p1.addActionListener(this);
		p2.addActionListener(this);
		p3.addActionListener(this);
		p4.addActionListener(this);
		p5.addActionListener(this);
		p6.addActionListener(this);
		p7.addActionListener(this);
		p8.addActionListener(this);
		p9.addActionListener(this);
		dodaj.addActionListener(this);
		odejmij.addActionListener(this);
		mnoz.addActionListener(this);
		dziel.addActionListener(this);
		kasuj.addActionListener(this);
		suma.addActionListener(this);
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		
		if (e.getSource()==p0) {
			screen.setText("0");
			wynik=0;		
		}
		if (e.getSource()==p1) {
			screen.setText("1");
			wynik=1;	
		}
		else if (e.getSource()==p2) {
			screen.setText("2");
			wynik=2;
		}
		else if (e.getSource()==p3) {
			screen.setText("3");
			wynik=3;			
		}
		else if (e.getSource()==p4) {
			screen.setText("4");
			wynik=4;	
		}
		else if (e.getSource()==p5) {
			screen.setText("5");
			wynik=5;	
		}
		else if (e.getSource()==p6) {
			screen.setText("6");
			wynik=6;	
		}
		else if (e.getSource()==p7) {
			
			wynik=(double) e.getSource();	
		screen.setText("" + wynik);
		}
		else if (e.getSource()==p8) {
			screen.setText("8");
			wynik=8;	
		}
		else if (e.getSource()==p9) {
			screen.setText("9");
			wynik=9;	
		}
		else if (e.getSource()==dodaj) {			
			pamiec=wynik;
			opcja=1;			
		}
		else if (e.getSource()==odejmij) {
			pamiec=wynik;	
			opcja=2;
		}
		else if (e.getSource()==mnoz) {
			pamiec=wynik;	
			opcja=3;
		}
		else if (e.getSource()==dziel) {
			pamiec=wynik;	
			opcja=4;
		}
		else if (e.getSource()==kasuj) {
			wynik=0;
			pamiec=0;
			screen.setText(""+wynik);
		}
		else if (e.getSource()==suma) {
				
			if (opcja==1) {
			wynik+=pamiec;
			screen.setText(" "+wynik+" ");
			}
			if (opcja==2) {
				wynik-=pamiec;
				screen.setText(" "+wynik+" ");
				}
			if (opcja==3) {
				wynik*=pamiec;
				screen.setText(" "+wynik+" ");
				}
			if (opcja==4) {
				wynik=pamiec/wynik;
				screen.setText(" "+wynik+" ");
				}
		}		
	}
}

W momencie kliknięcia przycisku z cyfrą np. 5 zmienna wynik ustawia się jako 5, nie wiem natomiast jak rozwiązać mój problem, gdy kliknę dwa razy przycisk z liczbą 5 zmienna wynik ustawiła się jako 55.

W tym miejscu :

else if (e.getSource()==p7) {
			
			wynik=(double) e.getSource();	
		screen.setText("" + wynik);
		}

próbowałem to zrobić w ten sposób ale także nie działa.

0

wydaje mi się, że dobrym rozwiązaniem byłoby zrobić sobie choćby ArrayList, do której przy każdym kliknięciu buttona, cyfra byłaby dodawana do ArrayListy. Potem przekazać cyfry zapisane w Array do innej zmiennej jako String i zrzutować to jako double?
Znaczy się, trochę inaczej, żeby było poprawnie ArrayList<String>, wtedy też można przekazać np. kropkę lub przecinek jako znak dla ułamków dziesiętnych.

(double) e.getSource(); nie da Tobie dwóch, czy iluśtam cyfr po kolei, double to typ prosty.
Możesz też wykorzystać proste tablice np. double[] czy int[], ale to się mija z celem, bo za każdym kliknięciem musiałbyś robić kopię takiej tablicy.

0

W Javie nie ma instrukcji switch?
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
Chyba to lepsze niż drabinka if-ów?

0

Jeśli się uczysz i chcesz żeby Twoja nauka GUI nie poszła na marne to użyj Netbeans.
Jeśli pracujesz, tym bardziej.

2
  1. Nie rób klas "człowiek orkiestra". Jak coś jest okienkiem to jest okienkiem a nie action listenerem
  2. Nie wpychaj wszystkich akcji do jednej biednej funkcji z milionem ifów. Zrób sobie po prostu osobne action listenery. Masz jakiś limit narzucony czy co?

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