Erste Schritte JButton funktioniert nicht trotz richtiger Methode.

Ich habe zu einer Bank welche ich programmiert habe mit einzahlen, auszahlen usw. eine Kontoklasse und eine GUI erstellt, über die das ablaufen soll. Es geht mir jetzt nur um die Methode "einzahlen". Diese Methode funktioniert eigentlich, aber nur wenn ich sie von der Bank aus teste, aber nicht in der GUI. Unten sind die Quelltexte von den Klassen und der GUI, könnte es sich mal jemand anschauen und vlt gucken wo der Fehler liegt. Die GUI hält übrigens die Klasse Bank und die Bank die Klasse Konto.







Java:
public class Bank {
    private Konto[] kto=new Konto[5];
    private int ppin, pktnr;
    public Bank() {
        for (int i= 0; i<5;i++){
            kto[i] = new Konto(i);
        }
    }

    public Konto FindeKonto (int pktnr) {
        for (int i=0; i<kto.length ; i++) {

            if (pktnr==kto[i].getktnr()) return kto[i];
        }
        return null;
    }

    public void einzahlen (int pktnr  , int b) {

        Konto dummy=FindeKonto(pktnr);

        dummy.einzahlen(b);
    }

    public void  auszahlen(int pktnr , int ppin , int b) {
        Konto dummy=FindeKonto(pktnr);
        if(dummy.getPinok(ppin)){
            dummy.auszahlen(b);
        }
    }

    public void überweisen(int fktnrAbheben , int pktnrEinzahlen ,int ppin,int b){
        for (int i=0; i<kto.length;i++){
            if(pktnrEinzahlen==kto[i].getktnr()){
                kto[i].einzahlen(b);
            }
            if(fktnrAbheben==kto[i].getktnr() && kto[i].getPinok(ppin)){
                kto[i].auszahlen(b);
            }
        }
    }
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Java:
import java.awt.*; //abstract windowing toolkit   
import javax.swing.*; //swing-Klassen   
import java.awt.event.*; //Event-Klassen

public class Layout extends JFrame implements ActionListener

 
{   
    private Bank bank = new Bank() ;
    private String [] s = {"Einzahlen" , "Auszahlen" , "Überweisung" , "Kontostand" , "Pin" , "Changepin"}; 
    private JButton [] jb = new JButton[s.length]; 
    private JTextArea jtf1,jtf2,jtf3,jtf4,jtf5; //Deklaration eines Objektes aus der Klasse JTextField   
    private JButton jb1,jb2,jb3,jb4,jb5,jb6;
    private Font f;   

    public Layout()   
    {   
        super("BankLayout"); //ruft den Konstruktor der Oberklasse (JFrame) auf   
        setDefaultCloseOperation(3); //schließen und alle Prozesse beenden   
        setLayout(null); //schaltet Layout Manager aus   
        setBounds(300,300,1100,700); //(x,y Breite,Höhe) vom Fenster   
        getContentPane().setBackground(new Color(198,44,58)); //RGB   
        jtf1 = new JTextArea(); //Instanziieren eines neuen Objekts der Klasse JTextField   
        f = new Font("Roman",1,20);   
        jtf1.setFont (f);   
        jtf1.setText("");   
        jtf1.setEditable(true);   
        jtf1.setBounds(680,300,145,60); //am Objekt selber wird Methode aufgerufen   
        add(jtf1); //fügt Objekt dem Cont ainer (=ContentPane) hinzu   
        setVisible(true); //schaltet ganzen JFrame auf SICHTBAR   
        setResizable(false) ;   
        jtf2 = new JTextArea(); //Instanziieren eines neuen Objekts der Klasse JTextField   
        jtf2.setFont (f);   
        jtf2.setText("");   
        jtf2.setEditable(true);   
        jtf2.setBounds(100,250,145,60); //am Objekt selber wird Methode aufgerufen   
        add(jtf2); //fügt Objekt dem Container (=ContentPane) hinzu   

        jtf3 = new JTextArea(); 
        jtf3.setFont (f);   
        jtf3.setText("");   
        jtf3.setEditable(true);   
        jtf3.setBounds(100,350,145,60); //am Objekt selber wird Methode aufgerufen   
        add(jtf3);

        jtf4 = new JTextArea();
        jtf4.setFont (f);
        jtf4.setText("Kontonummer");
        jtf4.setEditable(false);
        jtf4.setBounds(100,170,145,60);
        add(jtf4);

        jtf5 = new JTextArea();
        jtf5.setFont(f);
        jtf5.setText("Pin eingeben");
        jtf5.setEditable(false);
        jtf5.setBounds(100,430,145,60);
        add(jtf5);
        setVisible(true);

        jb1 = new JButton();
        jb1.setBounds(350,100,160,60);
        jb1.setText("Abheben");
        add (jb1);

        jb2 = new JButton();
        jb2.setBounds(350,170,160,60);
        jb2.setText("Einzahlen");
        add (jb2);

        jb3 = new JButton();
        jb3.setBounds(350,240,160,60);
        jb3.setText("Überweisung");
        add (jb3);

        jb4 = new JButton();
        jb4.setBounds(350,310,160,60);
        jb4.setText("Kontostand");
        add (jb4);

        jb5 = new JButton();
        jb5.setBounds(350,380,160,60);
        jb5.setText("Pin");
        add (jb5);

        jb6 = new JButton();
        jb6.setBounds(350,450,160,60);
        jb6.setText("Change Pin");
        add (jb6);

    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource()==jb[2]) {
            int pktnr = new Integer(jtf2.getText());
            int b = new Integer (jtf1.getText());

            bank.einzahlen(pktnr , b);

        }
        if (e.getSource()==jb[1]) {
            int pktnr = new Integer(jtf2.getText());
            int b = new Integer (jtf1.getText());
            int ppin = new Integer (jtf3.getText());

            bank.auszahlen(pktnr , ppin , b);
        }
    }
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------

Java:
public class Konto
 
{
    private int ktostand , ktnr , pin;
    public Konto(int pktnr){
        ktnr= pktnr;
        pin=4711;
        ktostand=0;
    }
    public Konto(int pktnr , int ppin , int pktostand) {
        ktnr = pktnr ;
        pin = ppin;
        ktostand = pktostand;
    }
    public int getktostand() {
        
         return ktostand;
    }
    public void setPin(int pinneu , int pinalt) {
        if (pin==pinalt)pin = pinneu;
        else System.out.println("Falscher Pin") ;
        
        
    }
    public boolean getPinok(int ppin){
        return (pin==ppin);
      
    }
    public int getktnr() {       
        return ktnr;
    }
    public void einzahlen(int b){
        ktostand+=b;
    }
    public void auszahlen (int b){
        ktostand-=b;
    }
}
 
Wie im anderen Thread schon vermutet: es fehlt die Registrierung des ActionListeners. Außerdem vergleichst Du im ActionListener mit den falschen Buttons (jb2 vs jb[2]).
 
Also was genau muss ich jetzt noch ändern? Den ersten Punkt mit den unterschiedlichen Beschriftung der JButtons habe ich jetzt bearbeitet.
 
OK, Du musst erstmal verstehen, dass Swing in erster Linie ereignisgesteuert arbeitet. Wenn Du auf einen Button klickst, wird ein Ereignis ausgelöst - in dem Fall ein ActionEvent. Auf dieses Ereignis kannst Du mittels einer Implementierung von ActionListener reagieren, indem Du eine Implementierung von ActionListener beim jeweiligen Button registrierst. Dazu verwendest Du die Methode JButton#addActionListener.

Da Deine Klasse Layout das Interface ActionListener implementiert, kannst Du also schreiben:
Java:
        jb2 = new JButton();
        jb2.setBounds(350,170,160,60);
        jb2.setText("Einzahlen");      
        jb2.addActionListener(this);
        add (jb2);
Das array mit den Buttons ist doch leer oder übersehe ich etwas?
Würde ich auch sagen, darum vergleicht er ja die falschen "Buttons" :)
 
Ok hab ich hinzugefügt, nur jetzt noch, wie genau muss ich den JButton den jetzt bezeichnen beim ActionListener? Doch einfach nur jb2 oder?
 
Ja, nachdem Dein JButton jb2 heißt... Übrigens: gewöhne Dir am besten von Anfang an, vernünftige Bezeichner zu verwenden. "jb2" ist absolut nichtssagend.

Noch eine Ergänzung zum ActionListener: bei einem objektorientierten Ansatz würde jeder Button seinen ActionListener bekommen und nicht für alle Buttons der gleiche verwendet.
 
Java:
public void actionPerformed(ActionEvent e) {
        if (e.getSource()==jb2) {
            int pktnr = new Integer(jtf2.getText());
            int b = new Integer (jtf1.getText());

            bank.einzahlen(pktnr , b);
          

        }
      
    }

Java:
jb2 = new JButton();
        jb2.setBounds(350,170,160,60);
        jb2.setText("Einzahlen");
        jb2.addActionListener(this);
        add (jb2);
So richtig?
 
Also wie gehabt passiert nichts, und was genau heißt ich habe keine Ausgabe? Wo genau muss denn etwas ausgegeben werden?
 
Ok ich habe beim falschen Kommentar geguckt, wie update ich denn den Text in meiner GUI? Ich möchte, wenn ich die Bank inspiziere den Kontostand dann sehen mit dem dazugekommenem Geld. Normal kann ich das auch schon, nur wenn ich das nun versuche über die GUI zu überweisen verändert sich nichts, also der Betrag wird irgendwie nirgendwo draufgebucht.
 
Normal kann ich das auch schon, nur wenn ich das nun versuche über die GUI zu überweisen verändert sich nichts, also der Betrag wird irgendwie nirgendwo draufgebucht.
Der wird schon draufgebucht, nur der Kontostand wird nicht angezeigt. Für den Kontostand hast Du doch einen Button: jb4.

Im ActionListener musst Du also, wenn jb4 gedrückt wurde, den Kontostand vom Konto lesen und dann die betreffende Komponente in der GUI aktualisieren. In welchem "Feld" soll der Kontostand denn angezeigt werden? Bei Textfeldern und Labels kannst Du setText verwenden, um die Ausgabe zu aktualisieren.
 
Moin so sollte es funktionieren
Java:
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Bank {
	class Konto {
		private int pin = 1234;
		private int stand = 0;
		private int v_nr;

		Konto(int p_nr) {
			v_nr = p_nr;
		}

		int getktnr() {
			return v_nr;
		}

		void einzahlen(int b) {
			stand += b;
		}

		void auszahlen(int b) {
			stand -= b;
		}

		boolean getPinok(int ppin) {
			return pin == ppin;
		}
	}

	class Layout extends JFrame implements ActionListener {
		private static final long serialVersionUID = 1L;
		private Bank bank = new Bank();
		private String[] s = { "Einzahlen", "Auszahlen", "Überweisung", "Kontostand", "Pin", "Changepin" };
		private JButton[] jb = new JButton[s.length];
		private JTextArea jtf1, jtf2, jtf3, jtf4, jtf5; // Deklaration eines Objektes aus der Klasse JTextField
		private JButton jb1, jb2, jb3, jb4, jb5, jb6;
		private Font f;

		Layout() {
			super("BankLayout"); // ruft den Konstruktor der Oberklasse (JFrame) auf
			
			setLayout(null); // schaltet Layout Manager aus
			setBounds(300, 300, 1100, 700); // (x,y Breite,Höhe) vom Fenster
			getContentPane().setBackground(new Color(198, 44, 58)); // RGB
			jtf1 = new JTextArea(); // Instanziieren eines neuen Objekts der Klasse JTextField
			f = new Font("Roman", 1, 20);
			jtf1.setFont(f);
			jtf1.setText("");
			jtf1.setEditable(true);
			jtf1.setBounds(680, 300, 145, 60); // am Objekt selber wird Methode aufgerufen
			add(jtf1); // fügt Objekt dem Cont ainer (=ContentPane) hinzu
			
			jtf2 = new JTextArea(); // Instanziieren eines neuen Objekts der Klasse JTextField
			jtf2.setFont(f);
			jtf2.setText("");
			jtf2.setEditable(true);
			jtf2.setBounds(100, 250, 145, 60); // am Objekt selber wird Methode aufgerufen
			add(jtf2); // fügt Objekt dem Container (=ContentPane) hinzu

			jtf3 = new JTextArea();
			jtf3.setFont(f);
			jtf3.setText("");
			jtf3.setEditable(true);
			jtf3.setBounds(100, 350, 145, 60); // am Objekt selber wird Methode aufgerufen
			add(jtf3);

			jtf4 = new JTextArea();
			jtf4.setFont(f);
			jtf4.setText("Kontonummer");
			jtf4.setEditable(false);
			jtf4.setBounds(100, 170, 145, 60);
			add(jtf4);

			jtf5 = new JTextArea();
			jtf5.setFont(f);
			jtf5.setText("Pin eingeben");
			jtf5.setEditable(false);
			jtf5.setBounds(100, 430, 145, 60);
			add(jtf5);
			setVisible(true);

			jb1 = new JButton();
			jb1.setBounds(350, 100, 160, 60);
			jb1.setText("Abheben");
			jb1.addActionListener(this);
			add(jb1);

			jb2 = new JButton();
			jb2.setBounds(350, 170, 160, 60);
			jb2.setText("Einzahlen");
			jb2.addActionListener(this);
			add(jb2);

			jb3 = new JButton();
			jb3.setBounds(350, 240, 160, 60);
			jb3.setText("Überweisung");
			jb3.addActionListener(this);
			add(jb3);

			jb4 = new JButton();
			jb4.setBounds(350, 310, 160, 60);
			jb4.setText("Kontostand");
			jb4.addActionListener(this);
			add(jb4);

			jb5 = new JButton();
			jb5.setBounds(350, 380, 160, 60);
			jb5.setText("Pin");
			jb5.addActionListener(this);
			add(jb5);

			jb6 = new JButton();
			jb6.setBounds(350, 450, 160, 60);
			jb6.setText("Change Pin");
			jb6.addActionListener(this);
			add(jb6);

			setResizable(false);
			setDefaultCloseOperation(3); // schließen und alle Prozesse beenden
			setVisible(true); // schaltet ganzen JFrame auf SICHTBAR
		}

		public void actionPerformed(ActionEvent e) {
			if (e.getSource() == jb[2]) {
				int pktnr = Integer.parseInt(jtf2.getText());
				int b = Integer.parseInt(jtf1.getText());

				bank.einzahlen(pktnr, b);
			}
			if (e.getSource() == jb[1]) {
				int pktnr = Integer.parseInt(jtf2.getText());
				int b = Integer.parseInt(jtf1.getText());
				int ppin = Integer.parseInt(jtf3.getText());

				bank.auszahlen(pktnr, ppin, b);
			}
		}
	}

	private Konto[] kto = new Konto[5];
	private int ppin, pktnr;

	public Bank() {
		for (int i = 0; i < 5; i++) {
			kto[i] = new Konto(i);
		}
	}

	public Konto FindeKonto(int pktnr) {
		for (int i = 0; i < kto.length; i++) {

			if (pktnr == kto[i].getktnr())
				return kto[i];
		}
		return null;
	}

	public void einzahlen(int pktnr, int b) {
		Konto dummy = FindeKonto(pktnr);

		dummy.einzahlen(b);
	}

	public void auszahlen(int pktnr, int ppin, int b) {
		Konto dummy = FindeKonto(pktnr);
		if (dummy.getPinok(ppin)) {
			dummy.auszahlen(b);
		}
	}

	public void überweisen(int fktnrAbheben, int pktnrEinzahlen, int ppin, int b) {
		for (int i = 0; i < kto.length; i++) {
			if (pktnrEinzahlen == kto[i].getktnr()) {
				kto[i].einzahlen(b);
			}
			if (fktnrAbheben == kto[i].getktnr() && kto[i].getPinok(ppin)) {
				kto[i].auszahlen(b);
			}
		}
	}

	public static void main(String[] args) {
		Layout layout = new Bank().new Layout();
	}
}
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben