Kalkulator Java - doprowadzenie kodu do działającej postaci

0

Wczoraj zamieściłem tutaj posta dotyczącego mojego kalkulatora w Javie - miałem problem z użyciem klasy final, który udało mi się rozwiązać.
Jednak chciałbym, aby ktoś teraz ten poniższy kod przekształcił tak, aby kalkulator działał (doprowadza mnie do szewskiej pasji!!!). Kod na dole jest zmodyfikowany względem starego, wiem, że znajdują się tutaj dziwne rozwiązania, ale jestem kompletnym samoukiem i czasami ciężko mi coś wymyślić (np. wciąż nie mam pojęcia do czego przydaje się możliwość stworzenia wielu klas w Javie).

A teraz opis problemu (pracuję w Eclipsie) - jak ktoś ma czas to prosiłbym o analizę:
wpisuję liczbę 13 >> naciskam "+" >> JLabel numberX przyjmuje wartość 13 >> wpisuję 15 >> naciskam "=" >> numberY wynosi 15 >> wynik 28 (wszystko idzie na razie dobrze) >> naciskam "+" >> numberX przyjmuje wartość 28 >> wpisuję 12 >> naciskam "=" >> numberX ma wartość 28, numberY 40, a wynik to 68 (i tutaj leży problem).

Z góry dziękuję!

 
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.JButton;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Color;
import java.awt.Font;
import javax.swing.DropMode;


public class App extends JFrame {

	private JPanel contentPane;
	private JTextField PoleTekstowe1;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					App frame = new App();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public App() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 365, 290);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		PoleTekstowe1 = new JTextField();
		PoleTekstowe1.setHorizontalAlignment(SwingConstants.CENTER);
		PoleTekstowe1.setFont(new Font("Tahoma", Font.PLAIN, 16));
		PoleTekstowe1.setBounds(10, 10, 244, 50);
		contentPane.add(PoleTekstowe1);
		PoleTekstowe1.setColumns(10);
		
		final JLabel znak = new JLabel("");
		znak.setFont(new Font("Tahoma", Font.BOLD, 16));
		znak.setHorizontalAlignment(SwingConstants.CENTER);
		znak.setBounds(238, 10, 101, 50);
		contentPane.add(znak);
		
		final JLabel wynik = new JLabel("");
		wynik.setFont(new Font("Tahoma", Font.BOLD, 15));
		wynik.setForeground(Color.BLACK);
		wynik.setHorizontalAlignment(SwingConstants.CENTER);
		wynik.setBounds(94, 166, 101, 75);
		contentPane.add(wynik);
		
		final JButton equalsButton = new JButton("=");
		equalsButton.setFont(new Font("Tahoma", Font.BOLD, 11));
		equalsButton.setBounds(10, 166, 75, 75);
		contentPane.add(equalsButton);
		
		JButton plusButton = new JButton("+");
		plusButton.setFont(new Font("Tahoma", Font.BOLD, 11));
		plusButton.setBounds(10, 71, 75, 75);
		contentPane.add(plusButton);
		
		JButton minusButton = new JButton("-");
		minusButton.setFont(new Font("Tahoma", Font.BOLD, 18));
		minusButton.setBounds(94, 71, 75, 75);
		contentPane.add(minusButton);
		
		JButton timesButton = new JButton("*");
		timesButton.setFont(new Font("Tahoma", Font.BOLD, 11));
		timesButton.setBounds(179, 71, 75, 75);
		contentPane.add(timesButton);
		
		JButton divideButton = new JButton("/");
		divideButton.setFont(new Font("Tahoma", Font.BOLD, 11));
		divideButton.setBounds(264, 71, 75, 75);
		contentPane.add(divideButton);
		
		final JLabel numberX = new JLabel("");
		numberX.setBounds(274, 166, 46, 14);
		contentPane.add(numberX);
		
		final JLabel numberY = new JLabel("");
		numberY.setBounds(274, 196, 46, 14);
		contentPane.add(numberY);
		
		//dodawanie
		plusButton.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) 
			{
				double x=Double.parseDouble(PoleTekstowe1.getText());
				numberX.setText(""+x);
				znak.setText("+");
				equalsButton.addActionListener(new ActionListener() 
				{
					public void actionPerformed(ActionEvent e) 
					{	
						double x = Double.parseDouble(numberX.getText());
						double y = Double.parseDouble(PoleTekstowe1.getText());
						double z;
						z=x+y;
						numberY.setText(""+y);
						
						wynik.setText(""+z);
						PoleTekstowe1.setText("" + z);
					}
				}
				);
				
			}
		}
		);
		
		//odejmowanie
		minusButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) 
			{
				double x=Double.parseDouble(PoleTekstowe1.getText());
				numberX.setText(""+x);
				znak.setText("-");
				equalsButton.addActionListener(new ActionListener() 
				{
					public void actionPerformed(ActionEvent e) 
					{
						double x = Double.parseDouble(numberX.getText());
						double y=Double.parseDouble(PoleTekstowe1.getText());
						double z;
						z=x-y;
						numberY.setText(""+y);
						
						wynik.setText(""+z);
						PoleTekstowe1.setText("" + z);
						
					}
				}
				);
			}
		}
		);
		
		//mnożenie
		timesButton.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) 
			{
				double x=Double.parseDouble(PoleTekstowe1.getText());
				numberX.setText(""+x);
				znak.setText("*");
				equalsButton.addActionListener(new ActionListener() 
				{
					public void actionPerformed(ActionEvent e) 
					{
						double y=Double.parseDouble(PoleTekstowe1.getText());
						numberY.setText(""+y);
						double z;
						
						double x = Double.parseDouble(numberX.getText());
						z=x*y;
						
						wynik.setText(""+z);
						PoleTekstowe1.setText("" + z);
						
					}
				}
				);
			}
		}
		);
		
		//dzielenie
		divideButton.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) 
			{
				double x=Double.parseDouble(PoleTekstowe1.getText());
				numberX.setText(""+x);
				znak.setText("/");
				equalsButton.addActionListener(new ActionListener() 
				{
					public void actionPerformed(ActionEvent e) 
					{
						double y=Double.parseDouble(PoleTekstowe1.getText());
						numberY.setText(""+y);
						double z;
						
						double x = Double.parseDouble(numberX.getText());
						
							z=x/y;
						
						
						wynik.setText(""+z);
						PoleTekstowe1.setText("" + z);
						
					}
				}
				);
			}
		}
		);
	}
}
0

Skąd wytrzasnąłeś pomysł dodawania ActionListenera wewnątrz obsługi zdarzenia? W efekcie equalsButton ma wiele listenerów i jak klikniesz w niego to zadziałają wszystkie. Nie masz żadnej kontroli nad tym co się wydarzy ze zmiennymi.

0

Sam coś takiego wymyśliłem - mówiłem jestem samoukiem i myślałem, że equalsButton nie może zadziałać dopóki nie aktywuję dowolnego buttona z +/-///*

1

I tak jest, ale jeśli aktywujesz pierwszy button "+", to equalsButon dostaje Listenera i po kliknięciu w equalsButton kod Listenera się wykona. Po drugiej aktywacji buttona "+", equalsButton ma już dwa (identyczne) Listenery i po kliknięciu w equalsButton wykona się kod obu Listenerów.
Spróbuj zmienić w taki sposób: dodaj do equalsButton Listenera już na starcie programu. Ten Listener potrafi wszystko. Dodaj w klasie pole

private char lastButton = ' ';

Zmieniaj wartość tego pola po kliknięciu w przycisk (na '+','-','*' lub '/'). W metodzie actionPerformed przycisku equalsButton wykonuj działanie zależne od wartości tego pola.

                    public void actionPerformed(ActionEvent e) 
                    {
                        if(lastButton == ' ')
                        {
                            return;
                        }
                        double y=Double.parseDouble(PoleTekstowe1.getText());
                        numberY.setText(""+y);
                        double z;
 
                        double x = Double.parseDouble(numberX.getText());
                        switch(lastButton)
                        {
                            case '/':
                               z=x/y;
                               break;
                               ...
                        }
                        wynik.setText(""+z);
                        PoleTekstowe1.setText("" + z);
 
                    }
0

No... Mam tutaj efekt mojej własnej pracy i ogromnej pomocy forumowiczów. Dziękuję serdecznie użytkownikowi bogdans, który pomógł mi rozwiązać kluczowe problemy.

 
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.JButton;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Color;
import java.awt.Font;

public class Kalkulator extends JFrame {

	private JPanel contentPane;
	private JTextField PoleTekstowe1;

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Kalkulator frame = new Kalkulator();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	
	public Kalkulator() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 365, 290);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		PoleTekstowe1 = new JTextField();
		PoleTekstowe1.setHorizontalAlignment(SwingConstants.CENTER);
		PoleTekstowe1.setFont(new Font("Tahoma", Font.PLAIN, 16));
		PoleTekstowe1.setBounds(10, 10, 244, 50);
		contentPane.add(PoleTekstowe1);
		PoleTekstowe1.setColumns(10);
		
		final JLabel znak = new JLabel("");
		znak.setFont(new Font("Tahoma", Font.BOLD, 16));
		znak.setHorizontalAlignment(SwingConstants.CENTER);
		znak.setBounds(238, 10, 101, 50);
		contentPane.add(znak);
		
		final JLabel wynik = new JLabel("");
		wynik.setFont(new Font("Tahoma", Font.BOLD, 15));
		wynik.setForeground(Color.BLACK);
		wynik.setHorizontalAlignment(SwingConstants.CENTER);
		wynik.setBounds(94, 166, 101, 75);
		contentPane.add(wynik);
		
		JButton plusButton = new JButton("+");
		plusButton.setFont(new Font("Tahoma", Font.BOLD, 11));
		plusButton.setBounds(10, 71, 75, 75);
		contentPane.add(plusButton);
		
		JButton minusButton = new JButton("-");
		minusButton.setFont(new Font("Tahoma", Font.BOLD, 18));
		minusButton.setBounds(94, 71, 75, 75);
		contentPane.add(minusButton);
		
		JButton timesButton = new JButton("*");
		timesButton.setFont(new Font("Tahoma", Font.BOLD, 11));
		timesButton.setBounds(179, 71, 75, 75);
		contentPane.add(timesButton);
		
		JButton divideButton = new JButton("/");
		divideButton.setFont(new Font("Tahoma", Font.BOLD, 11));
		divideButton.setBounds(264, 71, 75, 75);
		contentPane.add(divideButton);
		
		final JLabel numberX = new JLabel("");
		numberX.setBounds(344, 218, -5, 23);
		contentPane.add(numberX);
		
		final JLabel numberY = new JLabel("");
		numberY.setBounds(344, 248, -5, -7);
		contentPane.add(numberY);
		
		final JButton equalsButton = new JButton("=");
		equalsButton.addActionListener(new ActionListener() 
		{
			
			public void actionPerformed(ActionEvent arg0)
			{
				
				
                    if(znak.getText() == " ")
                    {
                        return;
                    }
                    double z = 0;
                    double y=Double.parseDouble(PoleTekstowe1.getText());
                    numberY.setText(""+y);

                    double x = Double.parseDouble(numberX.getText());
                    switch(znak.getText())
                    {
                        case "+":
                           z=x+y;
                           break;
                        case "-":
                            z=x-y;
                            break;
                        case "*":
                            z=x*y;
                            break;
                        case "/":
                            z=x/y;
                            break;
                    }
                    PoleTekstowe1.setText("" + z);

                
			}
		});
		equalsButton.setFont(new Font("Tahoma", Font.BOLD, 11));
		equalsButton.setBounds(10, 166, 75, 75);
		contentPane.add(equalsButton);
		
		//dodawanie
		plusButton.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) 
			{
				double x=Double.parseDouble(PoleTekstowe1.getText());
				numberX.setText(""+x);
				znak.setText("+");
				
				
			}
		}
		);
		
		//odejmowanie
		minusButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) 
			{
				double x=Double.parseDouble(PoleTekstowe1.getText());
				numberX.setText(""+x);
				znak.setText("-");
				
			}
		}
		);
		
		//mnożenie
		timesButton.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) 
			{
				double x=Double.parseDouble(PoleTekstowe1.getText());
				numberX.setText(""+x);
				znak.setText("*");
				
			}
		}
		);
		
		//dzielenie
		divideButton.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) 
			{
				double x=Double.parseDouble(PoleTekstowe1.getText());
				numberX.setText(""+x);
				znak.setText("/");
				
			}
		}
		);
	}
}

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