JTextFields und OOP

soa

Erfahrenes Mitglied
Hallo zusammen,

ich habe da mal eine Dumme Frage:

Ich habe eine als private deklarierte Swing Komponente in einer
Klasse xy .

private JTextField name;

Nun habe ich eine andere Klasse, die eine Methode beinhaltet, um dieses Textfeld
zu befüllen.

......
name.setText(nname);

name ist natürlich in dieser Klasse nicht bekannt.

Wie muss ich hier vorgehen?

:confused:
 
Hallo,

eine Variante wäre, dass du eine Getter-Methode zur Verfügung stellst, mit der man auf das Textfeld zugreifen kann.

Es ist aber keine gute Idee, dass mehrere Klassen das Textfeld befüllen können. Schau dir mal das MVC-Pattern (Model-View-Controller) an. Es sieht vielleicht auf den ersten Blick nach mehr arbeit aus, erleichter dir aber die Arbeit, wenn du dein Programm noch erweitern möchtest oder was austauschen möchtest.

MFG

zEriX
 
Vielen Dank. Ich habe mal ein kleines MVC Beispiel geschrieben und ich würde gern wissen, ob es so in der Richtung gemeint war. Ich habe wirklich versucht, es kurz zu machen.

* Ich implementiere eigene Beobachter Methoden , ohne Observer + Observerable
* Ich arbeite mit Interfacen

Zuerst Interface Beobachter und die View

Code:
public interface Beobachter {
	
	void aktualisiere(); 

}

Code:
    import java.awt.Component;
    import java.awt.GridBagConstraints;
	import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;




public class View extends JFrame implements ActionListener, Beobachter {
	
	Modelinterface model; 
	Controllerinterface1 controller; 
	
	private JTextField name;
	
	
	
	
	
	  public View(Controllerinterface1 controller, Modelinterface model) { 
		   
		   this .model = model; 
		   this.controller = controller; 
		   
		   model.registriereBeobachter((Beobachter)this); 
		   
	   }
	
	   
	   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 void initiate()
	   {
		   JFrame f = new JFrame();
		      f.setVisible(true); 
		      f.setSize(800, 300);
		   
		   GridBagConstraints constraints = new GridBagConstraints();
		    GridBagLayout grid = new GridBagLayout();
		    f.setLayout(grid);
		   
		   //name label
		      buildConstraints(constraints, 2, 8, 1, 1, 80, 80);
		      constraints.fill = GridBagConstraints.NONE;
		      constraints.anchor = GridBagConstraints.EAST;
		      JLabel nameLabel = new JLabel("        Name: ", JLabel.LEFT);
		      f.add( nameLabel, constraints);
		      
	         //name Textfeld
		      buildConstraints(constraints, 3, 8, 1, 1, 20, 20);
		      constraints.fill = GridBagConstraints.NONE;
		      constraints.anchor = GridBagConstraints.WEST;
		      name = new JTextField(20);
		      name.setEditable(false);
		      f.add( name, constraints);
		      
		  	//	button
		       buildConstraints(constraints, 2, 9, 1, 1, 19, 40);
		      constraints.fill = GridBagConstraints.NONE;
		      constraints.anchor = GridBagConstraints.EAST;
		      JButton button1 = new JButton("Hole Daten");
		      button1.setActionCommand("actionbutton1");
		      button1.addActionListener(this);
		      f.add( button1, constraints);
		      
//		  	button
		       buildConstraints(constraints, 3, 9, 1, 1, 19, 40);
		      constraints.fill = GridBagConstraints.NONE;
		      constraints.anchor = GridBagConstraints.EAST;
		      JButton button2 = new JButton("Setze Daten");
		      button2.setActionCommand("actionbutton2");
		      button2.addActionListener(this);
		      f.add( button2, constraints);
		      
		       
		      
	   }



	public void aktualisiere()
	{
		String wert = model.getDaten();
		if (wert == "")
			name.setText("hier kommt nichts an.");
		else
			name.setText(wert);
	}


	   public void actionPerformed(ActionEvent e) {
			 if (e.getActionCommand().equals("actionbutton1")) {
		        System.out.println("button 1 geklickt!"); 
			    String wert = name.getText(); 
			    controller.setDaten(wert); 
		}
	         if  (e.getActionCommand().equals("actionbutton2")) {
                System.out.println("button 1 geklickt!"); 
	            String wert = controller.getDaten(); 
	             name.setText(wert); 
	    }       
     }//end actionperformend

}

Im Anschluß befindet sich das Modelinterface + Mode

Code:
public interface Modelinterface {
	

	
	void registriereBeobachter(Beobachter o); 
	
	void entferneBeobachter (Beobachter o); 
	
    public void setDaten(String wert); 
	
	public String getDaten(); 
	
	
}

Code:
import java.awt.event.ActionEvent;
import java.util.ArrayList;


public class Model implements Modelinterface
{
 
	ArrayList listBeobachtende = new ArrayList();
	
	String wert = "Hans Peter"; 
 
    
	public void setDaten(String wert)
	{
		this.wert = wert; 
		infoBeobachtende(); 
		
	}
	
	
	public String getDaten()
	{
		return wert; 
	}

	public void registriereBeobachter(Beobachter o)
	{
		listBeobachtende.add(o); 
	}
	
	
	public void infoBeobachtende()
	{
		for ( int i= 0; i < listBeobachtende.size(); i++)
		{
			Beobachter beobachter = (Beobachter)listBeobachtende.get(i); 
			beobachter.aktualisiere(); 
		}
	}
	
	
	public void entferneBeobachter(Beobachter o)
	{
		int i = listBeobachtende.indexOf(o); 	
		if (i >= 0)
			listBeobachtende.remove(i); 
	}


	
}

Nun der Controller mit dem Controllerinterface

Code:
import java.awt.event.ActionEvent;



public interface Controllerinterface1 {
	
	
	public void setDaten(String daten); 
	
	
	public String getDaten(); 
	
	
}

Code:
import java.awt.event.ActionEvent;



public class Controller implements Controllerinterface1 {

	
	Modelinterface model;
	View view; 
	
	public Controller(Modelinterface model)
	{
		this.model = model; 
		view = new View(this, model); 
		view.initiate(); 
	}
	

	public void setDaten(String wert)
	{
		model.setDaten(wert);
	}
	
	public String getDaten()
	{
		return model.getDaten(); 
		
	}
	
	
	

}

Zum Schluß eine Klasse Runner, die den Code aufruft.

Code:
public class Runner {
	
	public static void main (String args[])
	{
		Modelinterface model = new Model(); 
		Controllerinterface1 controller = new Controller(model); 
		
	}

}

Meinst du man könnte es so umsetzen, wenn Daten aus und in eine Datenbank gelesen werdensollen ?

Viele Grüße
SOA
 
Man kann das schon so machen. Was ich aber nicht gut finde ist, dass das Model die GUI aktualisiert. Das ist die Aufgabe des Controllers.

MFG

zEriX
 
Hallo Zerix,

vielen Dank schon einmal für Deine Antwort.

An welcher Stelle ist Dir das denn aufgefallen ?

Die Aktualisierung wir ja vom Interface Beobachter bereitgestellt, welches von der View
implementiert wird. Die Methode aktualisiere wird dann aber im Model aufgerufen...
Das sollte dann besser in den Controller ?

Ja, es ist so, dass das Model auf dem Rückweg nicht wieder über den Controller aggiert,
sondern direkt an die View anschließt. :rolleyes:

VG
 
Sowas sollte nicht sein, es sollte wenn möglich alles über den Controller laufen.

MFG

zEriX
 
Zurück