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, botów: 0