Listener

ernst

Top Contributor
Hallo allerseits,
Das folgende Programm soll ein einfacher Taschenrechner sein, der 2 Zahlen addiert.
Habe versucht dies mit dem Entwurfsmuster MVC zu machen.
Leider funktioniert der Listener nicht, d.h. bei einem Klick auf den Button + wird nicht die Methode actionPerformed aufgerufen.
Habe dies mit einer inneren, anonymen Klasse versucht.
Kann mir jemand sagen, warum dies nicht geht und was ich ändern muss, damit es geht ?

mfg
Ernst


Java:
package MainTaschenrechnermvc10;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;


public class TaschenrechnerMVC10 {
	public static void main(String[] args) {
            TRController trController = new TRController();
            TRView trView = new TRView();
            trView.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}



class TRModel{
    private double sum;
    
    public TRModel(){
        reset();
    }
    
    public void addiere(double wert1, double wert2){
        sum = wert1 + wert2;
    }
 
    public void reset(){
        sum = 0;
    }

    public double getSumme(){
        return sum;
    }
}

class TRView extends JFrame{
	// Stelle in MyFenster deklarieren, an die montiert wird.
	private Container mycont;
	// Buttons deklarieren
	private JButton mybtPlus;
	// Textfelder deklarieren
	private JTextField mytfZahl1;
	private JTextField mytfZahl2;
	private JTextField mytfErg;
	private JLabel dummyLabel1;
	private JLabel dummyLabel2;	
	// Eine Zeichenfläche deklarieren
	private JPanel myp;
	private GridLayout myGL23;
	
	// Konstruktor
	public TRView(){
		// Liefert die Stelle in MyFenster, an die montiert wird.
		mycont = getContentPane();
		// Erzeugt jeweils ein Button
		mybtPlus=new JButton("+");
		// Erzeugt jeweils ein einzeiliges Textfeld mit dem vorgegebenen
		// Text und der vorgegebenen Spaltenzahl. Dieser Text kann 
		// (im Gegensatz zu einem Label) editiert werden
		mytfZahl1=new JTextField("hier 1. Zahl eingeben",30);
		mytfZahl2=new JTextField("hier 2. Zahl eingeben",30);
		mytfErg=new JTextField("hier kommt das Ergebnis",30);
		// Ein paar Dummy Labels
		dummyLabel1 = new JLabel();
		dummyLabel2 = new JLabel();		
		// Erzeugt jeweils ein Label (Beschriftung) mit dem vorgegebenen 
		// Text Dieser Text kann (im Gegensatz zu einem Textfeld) nicht 
		// editiert werden
		// Erzeugt eine Zeichenfläche
		myp = new JPanel();
		// Erzeugt ein Layout
		myGL23 = new GridLayout(2,3);
		// Ordnet das Layout der Zeichenfläche (Panel) myp zu
		// ("formatiert" die Zeichenfläche damit)
		myp.setLayout(myGL23);
		// Montiert die grafischen Komponenten in die Zeichenfläche
		myp.add(mytfZahl1);
		myp.add(mytfZahl2);		
		myp.add(mytfErg);		
		myp.add(mybtPlus);
		myp.add(dummyLabel1);
		myp.add(dummyLabel2);		
		// Montiert die Zeichenfläche in das Fenster MyFenster
		mycont.add(myp);
		// Fensterüberschrift festlegen
		setTitle("Einfaches MVC");
		// Koordinaten des linken, oberen Ecks des Fensters festlegen
		// Koordinate x = 30, Koordinate y = 60.		
		setLocation(30,60);
		// Die Breite des Fensters in x-Richtung = 600
		// Die Breite des Fensters in y-Richtung = 400		
		setSize(600,400);
		// Macht das Fenster sichtbar
		setVisible(true);
	}

	public String getJTextField1(){
		return mytfZahl1.getText();	
	}

	
	public String getJTextField2(){
		return mytfZahl2.getText();	
	}
	
	
	public String getJTextFieldErg(){
		return mytfErg.getText();	
	}	
    
	public void setJTextField1(String str){
		this.mytfZahl1.setText(str);	
	}

	
	public void setJTextField2(String str){
		this.mytfZahl2.setText(str);
	}
	
	
	public void setJTextFieldErg(String str){
		this.mytfErg.setText(str);
	}	

        public void setAdditionsListener(ActionListener l){
            mybtPlus.addActionListener(l);
        }
    
}

class TRController{
    private TRView trView;
    private TRModel trModel;    
    
    public TRController(){
        trView = new TRView();
        trModel = new TRModel();        
        addListener();
    }
    
    public void addListener(){
        trView.setAdditionsListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                double wert1 = Double.valueOf(trView.getJTextField1());
                double wert2 = Double.valueOf(trView.getJTextField2());
                trModel.addiere(wert1, wert2);
                trView.setJTextFieldErg(String.valueOf(trModel.getSumme()));
                System.out.println("Hallo");
            }
        });
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Du erstellst zwei unterschiedliche Instanzen von TRView, einmal im Controller und einmal in der main. Nur bei der im Controller erstellten Instanz setzt du den ActionListener.
 
da es gerade nicht allzu sehr stört, kann ich mir den Hinweis erlauben:
verzichte bitte eher auf 'einfache Frage', 'warum funktioniert x nicht?' im Titel

ich habe nur 'x' im Titel übrig gelassen und der Informationsgehalt ist derselbe 😉
dass du ein Frage hast, dass irgendwas nicht funktioniert gilt für jedes Thema, einfach oder nicht wird sich ergeben

irgendwas individuelles wie 'Taschenrechner' könnte noch mitaufgenommen werden,
als markante Erinnerung worum es im Thema geht
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben