Powtórne wywołanie funkcji

0

Witam. Jestem początkującym "programistą" Javy. Chciałem napisać tak dla zabawy prosty programik (okienkowy) w którym podajemy ilość posiadanej gotówki i on automatycznie liczyłby nam np. ile za te pieniądze możemy kupić np. piw. Poniżej daję link do całego programu (razem z obrazkami itp):
http://www.speedyshare.com/files/29753062/Piwosz.rar
A tutaj kod źródłowy wrzucam:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.ImageIcon;

public class Piwosz extends JFrame{
  JMenuItem zamknij;
  JMenuItem informacje;
  JMenuItem autor;
  JTextField kasa;
  JButton policz;
  JLabel tekst;
  JLabel tytul;
  JLabel piwko;
  ImageIcon obrazek_tytulowy;
  
  JLabel lech;
  JLabel warka;
  JLabel tyskie;
  JLabel zubr;
  JLabel zywiec;
  JLabel tatra;
  JLabel harnas;
  ImageIcon piwo_lech;
  ImageIcon piwo_warka;
  ImageIcon piwo_tyskie;
  ImageIcon piwo_zubr;
  ImageIcon piwo_zywiec;
  ImageIcon piwo_tatra;
  ImageIcon piwo_harnas;
  
  public ActionListener al = new ActionListener(){
    public void actionPerformed(ActionEvent e){
      if(e.getSource() == zamknij){
        dispose();
      }
      else if(e.getSource() == policz){
        String kasioreczka = kasa.getText();
        int kasiorka = Integer.parseInt(kasioreczka);
        oblicz(kasiorka);
      }
    }
  };
  public Piwosz(){
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     setLayout(new FlowLayout(FlowLayout.CENTER, 0, 10));
     
     JMenuBar mb = new JMenuBar();
     JMenu menu = new JMenu("Menu główne");
     zamknij = new JMenuItem("Zamknij program");
     informacje = new JMenuItem("Informacje o programie");
     autor = new JMenuItem("Autor programu");
     menu.add(informacje);
     menu.add(autor);
     menu.add(zamknij);
     mb.add(menu);
     setJMenuBar(mb);
     zamknij.addActionListener(al);
     
     
     obrazek_tytulowy = new ImageIcon("images/obrazek_tytulowy.png");
     piwko = new JLabel(obrazek_tytulowy);
     
     kasa = new JTextField(10);
     
     policz = new JButton("Oblicz ilość piw");
     policz.addActionListener(al);
     
     tekst = new JLabel();
     tytul = new JLabel();
     tytul.setText("Piwosz v1.0 made by M.Kowalik");
     tekst.setText("Podaj jaką dysponujesz ilością gotówki (w PLN):");
     
     add(piwko);
     add(tytul);
     add(tekst);
     add(kasa);
     add(policz);
     
     setSize(320, 540);
     setResizable(false); //blokada pomniejszania/powiekszania okienka
     setVisible(true);
  }
  public double oblicz(int forsa){
      //ponizej zeny piw. Oczywiscie zmyślone i przypadkowe.
     double cenaLecha = 3.10;
     double cenaZubra = 3.15;
     double cenaTatry = 2.90;
     double cenaTyskiego = 2.50;
     double cenaZywca = 2.95;
     double cenaWarki = 2.45;
     double cenaHarnasia = 2.85;
     
     double ileLechow = forsa / cenaLecha;
     double ileZubrow = forsa / cenaZubra;
     double ileTatr = forsa / cenaTatry;
     double ileTyskich = forsa / cenaTyskiego;
     double ileZywcow = forsa / cenaZywca;
     double ileWark = forsa / cenaWarki;
     double ileHarnasi = forsa / cenaHarnasia;
     
     int iloscLechow = (int) ileLechow;
     int iloscZubrow = (int) ileZubrow;
     int iloscTatr = (int) ileTatr;
     int iloscTyskich = (int) ileTyskich;
     int iloscZywcow = (int) ileZywcow;
     int iloscWark = (int) ileWark;
     int iloscHarnasi = (int) ileHarnasi;
     
     piwo_lech = new ImageIcon("images/lech.gif");
     piwo_zubr = new ImageIcon("images/zubr.gif");
     piwo_tatra = new ImageIcon("images/tatra.gif");
     piwo_tyskie = new ImageIcon("images/tyskie.gif");
     piwo_zywiec = new ImageIcon("images/zywiec.gif");
     piwo_warka = new ImageIcon("images/warka.gif");
     piwo_harnas = new ImageIcon("images/harnas.gif");
     
     lech = new JLabel("Piwo Lech: " + iloscLechow + " sztuk", piwo_lech, JLabel.CENTER);
     zubr = new JLabel("Piwo Żubr: " + iloscZubrow + " sztuk", piwo_zubr, JLabel.CENTER);
     tatra = new JLabel("Piwo Tatra: " + iloscTatr + " sztuk", piwo_tatra, JLabel.CENTER);
     tyskie = new JLabel("Piwo Tyskie: " + iloscTyskich + " sztuk", piwo_tyskie, JLabel.CENTER);
     zywiec = new JLabel("Piwo Żywiec: " + iloscZywcow + " sztuk", piwo_zywiec, JLabel.CENTER);
     warka = new JLabel("Piwo Warka: " + iloscWark + " sztuk", piwo_warka, JLabel.CENTER);
     warka = new JLabel("Piwo Harnaś: " + iloscHarnasi + " sztuk", piwo_harnas, JLabel.CENTER);
     
     add(lech);
     add(zubr);
     add(tyskie);
     add(tatra);
     add(zywiec);
     add(warka);
     setVisible(true);
     return 0;
  }
  public static void main(String args[]){
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        new Piwosz();
      }
    });
  }
}

Ale może do rzeczy:
Jak widzimy program raczej działa, jednak jest taki problem, że tylko raz. Dokładniej mówiąc gdy wpiszemy w pole tekstowe ilosc naszej gotowki i wcisniemy klawisz "Oblicz" to wyświetla nam poprawne dane. Jednak, gdy chcemy zmienić wartość w polu tekstowym lub wpisać coś innego - już nic sie nie dzieje ani nie zmienia. Dlaczego?

0

Ja bym na Twoim miejscu inaczej obsłużył przycisk, np. tak:

policz.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e) 
			{
				String kasioreczka = kasa.getText();
		        int kasiorka = Integer.parseInt(kasioreczka);
		        oblicz(kasiorka);
			}
		});
0

Bajki opowiadasz, program działa poprawnie.

0

Dodałem to do kodu. Jednak program działa tak jak działał :( Kod wygląda następująco (zmiana w linii 63):

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.ImageIcon;

public class Piwosz extends JFrame{
  JMenuItem zamknij;
  JMenuItem informacje;
  JMenuItem autor;
  JTextField kasa;
  JButton policz;
  JLabel tekst;
  JLabel tytul;
  JLabel piwko;
  ImageIcon obrazek_tytulowy;
  
  JLabel lech;
  JLabel warka;
  JLabel tyskie;
  JLabel zubr;
  JLabel zywiec;
  JLabel tatra;
  JLabel harnas;
  ImageIcon piwo_lech;
  ImageIcon piwo_warka;
  ImageIcon piwo_tyskie;
  ImageIcon piwo_zubr;
  ImageIcon piwo_zywiec;
  ImageIcon piwo_tatra;
  ImageIcon piwo_harnas;
  
  public ActionListener al = new ActionListener(){
    public void actionPerformed(ActionEvent e){
      if(e.getSource() == zamknij){
        dispose();
      }
    }
  };
  public Piwosz(){
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     setLayout(new FlowLayout(FlowLayout.CENTER, 0, 10));
     
     JMenuBar mb = new JMenuBar();
     JMenu menu = new JMenu("Menu główne");
     zamknij = new JMenuItem("Zamknij program");
     informacje = new JMenuItem("Informacje o programie");
     autor = new JMenuItem("Autor programu");
     menu.add(informacje);
     menu.add(autor);
     menu.add(zamknij);
     mb.add(menu);
     setJMenuBar(mb);
     zamknij.addActionListener(al);
     
     
     obrazek_tytulowy = new ImageIcon("images/obrazek_tytulowy.png");
     piwko = new JLabel(obrazek_tytulowy);
     
     kasa = new JTextField(10);
     
     policz = new JButton("Oblicz ilość piw");
     
     policz.addActionListener(new ActionListener(){
                        public void actionPerformed(ActionEvent e) {
                                String kasioreczka = kasa.getText();
                        int kasiorka = Integer.parseInt(kasioreczka);
                                oblicz(kasiorka);
              }
      });
     
     tekst = new JLabel();
     tytul = new JLabel();
     tytul.setText("Piwosz v1.0 made by M.Kowalik");
     tekst.setText("Podaj jaką dysponujesz ilością gotówki (w PLN):");
     
     add(piwko);
     add(tytul);
     add(tekst);
     add(kasa);
     add(policz);
     
     setSize(320, 540);
     setResizable(false); //blokada pomniejszania/powiekszania okienka
     setVisible(true);
  }
  public double oblicz(int forsa){
      //ponizej zeny piw. Oczywiscie zmyślone i przypadkowe.
     double cenaLecha = 3.10;
     double cenaZubra = 3.15;
     double cenaTatry = 2.90;
     double cenaTyskiego = 2.50;
     double cenaZywca = 2.95;
     double cenaWarki = 2.45;
     double cenaHarnasia = 2.85;
     
     double ileLechow = forsa / cenaLecha;
     double ileZubrow = forsa / cenaZubra;
     double ileTatr = forsa / cenaTatry;
     double ileTyskich = forsa / cenaTyskiego;
     double ileZywcow = forsa / cenaZywca;
     double ileWark = forsa / cenaWarki;
     double ileHarnasi = forsa / cenaHarnasia;
     
     int iloscLechow = (int) ileLechow;
     int iloscZubrow = (int) ileZubrow;
     int iloscTatr = (int) ileTatr;
     int iloscTyskich = (int) ileTyskich;
     int iloscZywcow = (int) ileZywcow;
     int iloscWark = (int) ileWark;
     int iloscHarnasi = (int) ileHarnasi;
     
     piwo_lech = new ImageIcon("images/lech.gif");
     piwo_zubr = new ImageIcon("images/zubr.gif");
     piwo_tatra = new ImageIcon("images/tatra.gif");
     piwo_tyskie = new ImageIcon("images/tyskie.gif");
     piwo_zywiec = new ImageIcon("images/zywiec.gif");
     piwo_warka = new ImageIcon("images/warka.gif");
     piwo_harnas = new ImageIcon("images/harnas.gif");
     
     lech = new JLabel("Piwo Lech: " + iloscLechow + " sztuk", piwo_lech, JLabel.CENTER);
     zubr = new JLabel("Piwo Żubr: " + iloscZubrow + " sztuk", piwo_zubr, JLabel.CENTER);
     tatra = new JLabel("Piwo Tatra: " + iloscTatr + " sztuk", piwo_tatra, JLabel.CENTER);
     tyskie = new JLabel("Piwo Tyskie: " + iloscTyskich + " sztuk", piwo_tyskie, JLabel.CENTER);
     zywiec = new JLabel("Piwo Żywiec: " + iloscZywcow + " sztuk", piwo_zywiec, JLabel.CENTER);
     warka = new JLabel("Piwo Warka: " + iloscWark + " sztuk", piwo_warka, JLabel.CENTER);
     warka = new JLabel("Piwo Harnaś: " + iloscHarnasi + " sztuk", piwo_harnas, JLabel.CENTER);
     
     add(lech);
     add(zubr);
     add(tyskie);
     add(tatra);
     add(zywiec);
     add(warka);
     setVisible(true);
     return 0;
  }
  public static void main(String args[]){
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        new Piwosz();
      }
    });
  }
}
1

Już napisałem, bajki opowiadasz. Dopiero po kilku kliknięciach nic się nie dzieje, wynika to z tego, że rozmiarów okna nie można powiększyć (setResizable(false)), nie usuwasz wcześniejszych wyników zatem kończy się miejsce w oknie.

0

aha... teraz rozumiem. Ale w takim razie w jaki sposób mogę "usunąć" wczesniejsze wyniki?

1
     if(lech!=null)
     {
         remove(lech);
         remove(zubr);
         remove(tatra);
         remove(tyskie);
         remove(warka);
         remove(zywiec);
     }

     lech = new JLabel("Piwo Lech: " + iloscLechow + " sztuk", piwo_lech, JLabel.CENTER);
     zubr = new JLabel("Piwo Żubr: " + iloscZubrow + " sztuk", piwo_zubr, JLabel.CENTER);
     tatra = new JLabel("Piwo Tatra: " + iloscTatr + " sztuk", piwo_tatra, JLabel.CENTER);
     tyskie = new JLabel("Piwo Tyskie: " + iloscTyskich + " sztuk", piwo_tyskie, JLabel.CENTER);
     zywiec = new JLabel("Piwo Żywiec: " + iloscZywcow + " sztuk", piwo_zywiec, JLabel.CENTER);
     warka = new JLabel("Piwo Warka: " + iloscWark + " sztuk", piwo_warka, JLabel.CENTER);

Dodaj jeszcze jakieś zabezpieczenie, użytkownik może przecież wprowadzić niepoprawne dane.

0

Bardzo dziękuję za pomoc. Oczywiście dodam jeszcze zabezpieczenia i jeszcze zmodyfikuję ten kod.
Jeszcze raz dzięki, pozdrawiam serdecznie!

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