ItemListener i ActionListener problem...

0

Zaczalem przygode z java 3 tygodnie temu wiec nie smiac sie ... ;]
Pisze prosty kalkulatorek, na tapecie mam JTextField (do wyswietlania wyniku) dwa kolejne JTextField (wprowadzanie wartosci dwoch zmiennych), JComboBox (4 opcje dla operacji +,-,*,/) oraz JButton.

problem w tym ze nie pobiera mi wartosci wybranej w JComboBox i dlatego nie wykonuja sie operacje "pod" JButton, dlaczego?? cos czuje ze blad jest banalny, ale siedze 2 godziny, kombinuje i nic...

ponizej kod, dzieki za ewentualna pomoc...

package testy;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class test extends JFrame implements ActionListener, ItemListener {
	JLabel wynikLabel=new JLabel("Wynik");
	JTextField wynik=new JTextField("", 20);
	
	JButton oblicz=new JButton("Oblicz");
	
	JLabel zm1Label=new JLabel("Podaj pierwszą zmienną");
	JTextField zm1=new JTextField("", 10);
	
	JLabel zm2Label=new JLabel("Podaj drugą zmienną");
	JTextField zm2=new JTextField("", 10);
	
	JComboBox operacja=new JComboBox();
	
	float dzialanie;
	float daneZm1;
	float daneZm2;
	String zmienna, operation, dzialanie1;
	
	void buildConstraints(GridBagConstraints gbc, int gx, int gy,
			int gw, int gh, int wx, int wy) {
		gbc.gridx=gx;
		gbc.gridy=gy;
		gbc.gridwidth=gw;
		gbc.gridheight=gh;
		gbc.weightx=wx;
		gbc.weighty=wy;
	}
	
	public test() {
		super("Test");
		setSize(200,200);
		GridBagLayout gridbag=new GridBagLayout();
		GridBagConstraints constraints=new GridBagConstraints();
		
		oblicz.addActionListener(this);
		
		JPanel pane=new JPanel();
		pane.setLayout(gridbag);
		
		//pole tekstowe z wynikiem
		buildConstraints(constraints, 0, 0, 2, 1, 0, 40);
		//constraints.fill=GridBagConstraints.WEST;
		//constraints.anchor=GridBagConstraints.EAST;
		wynik.setEditable(false);
		gridbag.setConstraints(wynik, constraints);
		pane.add(wynik);
		
		//pierwszy przycisk
		buildConstraints(constraints, 0, 1, 1, 1, 0, 20);
		constraints.fill=GridBagConstraints.CENTER;
		//constraints.anchor=GridBagConstraints.EAST;
		gridbag.setConstraints(zm1, constraints);
		pane.add(zm1);
		
		//drugi przycisk
		buildConstraints(constraints, 1, 1, 1, 1, 20, 20);
		constraints.fill=GridBagConstraints.EAST;
		gridbag.setConstraints(zm2, constraints);
		pane.add(zm2);
		
		//pole tekstowe zm1
		buildConstraints(constraints, 0, 2, 2, 1, 100, 100);
		gridbag.setConstraints(oblicz, constraints);
		pane.add(oblicz);
		
		//radiobuttony
		operacja.addItem("");
		operacja.addItem("dodaj");
		operacja.addItem("odejmij");
		operacja.addItem("pomnoz");
		operacja.addItem("podziel");
		pane.add(operacja);
			
		setContentPane(pane);
	}
	
	public static void main(String[] args) {
		JFrame frame=new test();
		ExitWindow exit=new ExitWindow();
		frame.addWindowListener(exit);
		
		frame.pack();
		frame.setVisible(true);
	}
	
	public void itemStateChanged(ItemEvent evt) {
		Object source=evt.getSource();
		if (source==operacja) {
			Object whichMarked=evt.getSource();
			operation=whichMarked.toString();

			
		}
		
	}
	
	
	
	public void actionPerformed(ActionEvent ae) {
		Object source=ae.getSource();
		if (source==oblicz) {
			
			daneZm1=Float.parseFloat(zm1.getText());
			daneZm2=Float.parseFloat(zm2.getText());

			
			if (operation=="dodaj") {
				dzialanie=daneZm1+daneZm2;
			}
			else if (operation=="odejmij") {
				dzialanie=daneZm1-daneZm2;
			}
			else if (operation=="pomnoz") {
				dzialanie=daneZm1*daneZm2;
			}
			else if (operation=="podziel") {
				dzialanie=daneZm1/daneZm2;
			}
						
			wynik.setText(""+dzialanie);
		
		}
		repaint();
	}
}


	
	class ExitWindow extends WindowAdapter {
		public void windowClosing(WindowEvent e) {
			System.exit(0);
		}
	}
0

sa bledy w komentarzach przy komponentach ale oczywiscie nie wplywa to na program...
tak pisze zeby sie ktos nie czepial :-P

0

operation=whichMarked.toString();
co to zwraca nazwę radiobuttona czy Id obiektu?
poza tym gdzie jest podpinasz ItemListenera do JComboBoxa?

0

wlasnie w tym jest caly problem, bo jak wyswietlam sobie np: w polu textowym to co zwraca ten itemlistener to zwraca: "null" i nie wiem co jest grane...
a dlaczego itemlistener do comboboxa? bo przerabiam sobie ksiazeczke java2 dla kazdego i w jakims przykladzie bylo tak zrobione i powinno zwracac nazwe wybranego comboboxa...

0

Wychodzi na to że

public void itemStateChanged(ItemEvent evt) {
     Object source=evt.getSource();
     if (source==operacja) {
             Object whichMarked=evt.getSource();
             operation=whichMarked.toString();
     }
}

nie za bardzo chce współpracować. hm... pobawiłem się debuggerem i odkryłem że itemStateChange nie jest nigdzie wywoływane. Dodałem:

        operacja.addItem( "podziel" );
        operacja.addItemListener( this );
        pane.add( operacja );

i już jest wywoływane. Jednak nadal ie chce zapisywać do operation to co potrzeba. Teraza ty szukasz, a ja wracam do pracy ;)

0

faktycznie tego nie bylo, ale szukamy dalej...

0

dzieki Koziolek, wszystko hula, jednak chodzilo tylko o to operacja.addItemListener(this);
oprocz tego zamiast getSource() powinno byc getItem w metodzie ItemListenera...
zalaczam kod:

package testy;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class test extends JFrame implements ActionListener, ItemListener {
	JLabel wynikLabel=new JLabel("Wynik");
	JTextField wynik=new JTextField("", 20);
	
	JButton oblicz=new JButton("Oblicz");
	
	JLabel zm1Label=new JLabel("Podaj pierwszą zmienną");
	JTextField zm1=new JTextField("", 10);
	
	JLabel zm2Label=new JLabel("Podaj drugą zmienną");
	JTextField zm2=new JTextField("", 10);
	
	JComboBox operacja=new JComboBox();
	
	float dzialanie;
	float daneZm1;
	float daneZm2;
	String zmienna, operation, dzialanie1;
	
	void buildConstraints(GridBagConstraints gbc, int gx, int gy,
			int gw, int gh, int wx, int wy) {
		gbc.gridx=gx;
		gbc.gridy=gy;
		gbc.gridwidth=gw;
		gbc.gridheight=gh;
		gbc.weightx=wx;
		gbc.weighty=wy;
	}
	
	public test() {
		super("Test");
		setSize(200,200);
		GridBagLayout gridbag=new GridBagLayout();
		GridBagConstraints constraints=new GridBagConstraints();
		
		oblicz.addActionListener(this);
		
		JPanel pane=new JPanel();
		pane.setLayout(gridbag);
		
		//pole tekstowe z wynikiem
		buildConstraints(constraints, 0, 0, 2, 1, 0, 40);
		//constraints.fill=GridBagConstraints.WEST;
		//constraints.anchor=GridBagConstraints.EAST;
		wynik.setEditable(false);
		gridbag.setConstraints(wynik, constraints);
		pane.add(wynik);
		
		//pierwszy przycisk
		buildConstraints(constraints, 0, 1, 1, 1, 0, 20);
		constraints.fill=GridBagConstraints.CENTER;
		//constraints.anchor=GridBagConstraints.EAST;
		gridbag.setConstraints(zm1, constraints);
		pane.add(zm1);
		
		//drugi przycisk
		buildConstraints(constraints, 1, 1, 1, 1, 20, 20);
		constraints.fill=GridBagConstraints.EAST;
		gridbag.setConstraints(zm2, constraints);
		pane.add(zm2);
		
		//pole tekstowe zm1
		buildConstraints(constraints, 0, 2, 2, 1, 100, 100);
		gridbag.setConstraints(oblicz, constraints);
		pane.add(oblicz);
		
		//radiobuttony
		operacja.addItem("");
		operacja.addItem("dodaj");
		operacja.addItem("odejmij");
		operacja.addItem("pomnoz");
		operacja.addItem("podziel");
		operacja.addItemListener(this);
		pane.add(operacja);
			
		setContentPane(pane);
	}
	
	public static void main(String[] args) {
		JFrame frame=new test();
		ExitWindow exit=new ExitWindow();
		frame.addWindowListener(exit);
		
		frame.pack();
		frame.setVisible(true);
	}
	
	public void itemStateChanged(ItemEvent evt) {
		Object source=evt.getSource();
		if (source==operacja) {
			Object whichMarked=evt.getItem();
			operation=whichMarked.toString();

			
		}
		
	}
	
	
	
	public void actionPerformed(ActionEvent ae) {
		Object source=ae.getSource();
		if (source==oblicz) {
			
			daneZm1=Float.parseFloat(zm1.getText());
			daneZm2=Float.parseFloat(zm2.getText());

			
			if (operation=="dodaj") {
				dzialanie=daneZm1+daneZm2;
			}
			else if (operation=="odejmij") {
				dzialanie=daneZm1-daneZm2;
			}
			else if (operation=="pomnoz") {
				dzialanie=daneZm1*daneZm2;
			}
			else if (operation=="podziel") {
				dzialanie=daneZm1/daneZm2;
			}
						
			wynik.setText(""+dzialanie);
		
		}
		repaint();
	}
}


	
	class ExitWindow extends WindowAdapter {
		public void windowClosing(WindowEvent e) {
			System.exit(0);
		}
	}
0

Uwagi na przyszłość:

  • Nazwy klas z wielkiej litery
  • używaj < code = java> - bez spacji oczywiście

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