# Getter/Setter



## cam (27. Jan 2009)

Hallo,

also ich will nun mein Projekt überarbeiten und hab des öfteren gehört und gelesen, public-Variablen sind nicht so toll, lieber mit getter und setter arbeiten. Hab auch dazu einiges gelesen und mit meiner Chefin darüber diskutiert. Sie programmiert FoxPro und ist der Meinung, dass doch public-Variablen gut sind und was getter und setter denn für einen Sinn haben? (Also mein Projekt ist in Java.) Ich kann ihr das aber nicht erklären, weil ich es selbst nicht verstehe.

Könnte mir (uns) das bitte nochmal jemand erklären und evtl ein kleines Beispiel zeigen?


----------



## SlaterB (27. Jan 2009)

das ist ein recht großes allgemeines Thema, siehe auch
http://www.google.de/search?hl=de&q=java+Sinn+getter+setter&meta=
-> z.B.
http://forum.de.selfhtml.org/archiv/2008/5/t171688/

http://groups.google.com/group/de.comp.lang.java/browse_thread/thread/b93059e48ae262fb
für viele Meinungen


----------



## ARadauer (27. Jan 2009)

ich muss jedoch anmerken, dass getter und setter einfach zum guten java stil gehören. es ist schon fast standard.

Der grundgedanke dahinter ist einfach, dass ich das innere meiner klasse nach aussen hin verstecke und nur durch eine öffentliche schnittstelle (meine public methoden) sichtbar mache.


ob jetzt deine FoxPro programmierende Chefin das gut findet, ist irrelevant, man macht es in java so. 


```
public class Kunde {
   
   private String name;
   private int alter;   

   public Kunde(String name, int alter) {
      super();
      this.name = name;
      this.alter = alter;
   }
   
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   
   public int getAlter() {
      return alter;
   }
   public void setAlter(int alter) {
      this.alter = alter;
   }    

}
```


----------



## cam (27. Jan 2009)

Also wenn ich in einer Klasse über ein Formular den Namen abfrage, z.B. beim Login, schreibe ich da in diese Klasse 



> public void setName(String name) {
> this.name = name;
> }



?

Und in einer anderen Klasse, in der ich den Namen noch einmal brauche dann



> public String getName() {
> return name;
> }



?

Mir fehlt einfach die Vorstellungskraft dazu. Wenn ich eine Variable public deklariere, dann kann ich einfach überall darauf zugreifen, irgendwie kann ich das aber nicht auf die getter und setter - Methoden übertragen.

Und was ist z.B. mit meinen Elementen im Formular?:


```
public static JInternalFrame login;
    public static JLabel benName;
    public static JLabel pass;
    public static JTextField txtBenName;
    public static JPasswordField txtPass;
    public static JButton btAnmelden;
    public static JButton btAbbrechen;
    public static JPanel benNamePanel;
    public static JPanel passPanel;
    public static JPanel btLoginPanel;
```

Das steht in meiner Klasse Frame.java und verarbeitet wird das ganze ja in Login.java.


```
char[] pass = Frame.txtPass.getPassword();
```
[/code]


----------



## Ebenius (27. Jan 2009)

ARadauer hat gesagt.:
			
		

> ich muss jedoch anmerken, dass getter und setter einfach zum guten java stil gehören. es ist schon fast standard.


Das Konzept gehört zum Beispiel zum Java Beans™ Standard. Sun Tutorial: Java Beans


----------



## Marco13 (27. Jan 2009)

cam hat gesagt.:
			
		

> Also wenn ich in einer Klasse über ein Formular den Namen abfrage, z.B. beim Login, schreibe ich da in diese Klasse
> ...
> Und in einer anderen Klasse, in der ich den Namen noch einmal brauche dann



Die get- und set-Methoden kommen immer in die Klasse, wo das Field (die Variable) liegt, auf die man zugrifen will. Die Vorteile sind durch Websuche zu finden. Die wichtigsten sind IMHO
- Man kann Variablen "Read-Only" machen (einfach nur get aber kein set anbieten)
- Man kann in den set-Methoden mehr machen: GEWÜNSCHTE Seiteneffekte, Sicheheitsabfragen...

```
class Person
{
    private int alter;
    
    void setAlter(int neuesAlter)
    {
        if (neuesAlter < 0) System.out.println("Vergiss es");
        else alter = neuesAlter;
    }
}
```





> Wenn ich eine Variable public deklariere, dann kann ich einfach überall darauf zugreifen, irgendwie kann ich das aber nicht auf die getter und setter - Methoden übertragen.
> 
> ```
> public static JInternalFrame login;
> ...


"Von überall" drauf zugreifen kann man nur, wenn sie auch *static* sind - und das ist (egal ob public oder nicht) grundsätzlich (d.h. mit GANZ wenigen Ausnahmen) gröbster Unfug - egal, in welcher Programmiersprache!


----------



## SirGecco (27. Jan 2009)

siehe z. B.

http://de.wikipedia.org/wiki/Zugriffsfunktion

oder

http://de.wikipedia.org/wiki/Datenkapselung_(Programmierung)


----------



## cam (27. Jan 2009)

Naja, aber was mache ich denn, wenn mir gesagt wird, die müssen static sein? Ich benutze Eclipse Ganymede.
Ich habe wirklich absolute Schwierigkeiten mit dem Thema, wie ihr ja merkt  :bahnhof: 


```
static Connection cn = null;
static PreparedStatement statement = null;
static ResultSet rs = null;
```

Wenn ich hier das static weglasse, kommen Fehlermeldungen und static wird verlangt.

In den anderen Klassen verwende ich diese Variablen ja zur Datenbankabfrage:


```
try{
        				PreparedStatement statement = (PreparedStatement) Frame.cn.prepareStatement("SELECT nutz_name FROM nutzer WHERE nutz_name = ?");
        				statement.setString(1, benName);
        				Frame.rs = statement.executeQuery();

        				if (Frame.rs.next()) {
    						System.out.println("Nutzer");
    					}
    					else{
    						JOptionPane.showMessageDialog(null, "Sie sind kein Nutzer dieses Systems!", "Login", JOptionPane.OK_CANCEL_OPTION);
    						Frame.txtBenName.setText(null);
    					}
        			}catch(Exception ex){
        				System.out.println("Keine Verbindung: " + ex);
        			}
```


----------



## ARadauer (27. Jan 2009)

```
Frame.cn.prepareStatement
```
ich programmiere seit 3 Jahren hauptberuflich in java, sowas seh ich mir gar nicht an ;-)


----------



## Ebenius (27. Jan 2009)

@cam: Du solltest dringend Java-Grundlagen lernen! Am besten mit einem Buch. Durchhangeln macht Dich nicht glücklich.

Wenn Dein Englisch vernünftig ist, hilft vielleicht Das Sun-Tutorial-Zeugs. Ansonsten wurde hier im Forum viel empfohlen. Und nicht nur halb durchblättern, sondern von vorn das Konzept verstehen.


----------



## Marco13 (27. Jan 2009)

Zum static: Das ist eben das Gegenteil von einer vernünftigen, objektorientierten Modellierung. Plakativ-polemisch forumuliert: Wenn alles static ist, kann man gleich alles in eine Riesenklasse packen  :autsch: Überleg' dir eine geeignete Klassenstruktur, ggf. mal nach sowas wie "Model View Controller" oder so Websuchen, und mach dir genau klar: 1. Was muss die jeweilige Klasse _können_ (d.h. welche Methoden soll sie anbieten), und 2. Was braucht die Klasse, um diese Methoden anbieten zu können (d.h. welche Fields/Variablen braucht die Klasse)...


----------



## cam (27. Jan 2009)

Also ich hab ein bisschen probiert und bin soweit, dass keine Fehlermeldungen mehr kommen, aber es funktioniert trotzdem nicht:

Es kann keine Verbindung hergestellt werden: java.lang.ClassCastException: com.microsoft.sqlserver.jdbc.SQLServerStatement cannot be cast to java.sql.PreparedStatement
Demo
Keine Verbindung: java.lang.NullPointerException
demo
Keine Verbindung: java.lang.NullPointerException

So, wie es vorher war, kam folgendes:

Keine Verbindung: java.lang.ClassCastException: com.microsoft.sqlserver.jdbc.SQLServerStatement cannot be cast to java.sql.PreparedStatement
Demo
Nutzer
demo
Login erfolgreich

Verbindung.java:


```
package forms;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Verbindung {

	private Connection cn = null;
	private PreparedStatement statement = null;
	private ResultSet rs = null;
	
    public Connection getCon(){
    	return cn;
    }

	public void setCon(Connection cn) {
		this.cn = cn;		
	}
	
	public PreparedStatement getPrepStat(){
		return statement;
	}
	
	public void setPrepStat(PreparedStatement statement){
		this.statement = statement;
	}
	
	public ResultSet getRes(){
		return rs;
	}
	
	public void setRes(ResultSet rs){
		this.rs = rs;
	}
}
```

Frame.java (Ausschnitt):


```
try{
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");	
			Verbindung verb = new Verbindung();
			verb.setCon(DriverManager.getConnection("jdbc:sqlserver://localhost; databaseName = Lager; user = sa; password = zie2oam"));			
			verb.setPrepStat((PreparedStatement)verb.getCon().createStatement());
			System.out.println("Verbindung hergestellt.");
		}catch(Exception ex){
			System.out.println("Es kann keine Verbindung hergestellt werden: " + ex);
		}
		Login.login();
```

Login.java:


```
package forms;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.PreparedStatement;

import javax.swing.JOptionPane;

/**
 * @author Cathleen
 *
 */
public class Login {

	public static void login() {		
		
		/**
		 * Prüfen, ob Passwort richtig
		 */
    
		Frame.btAnmelden.addActionListener(new ActionListener(){
        	int count = 0;
        	public void actionPerformed(ActionEvent event){
        		if(event.getActionCommand().equals("Anmelden")){
        			
    				//Benutzername
        			String benName = Frame.txtBenName.getText();
        			benName = benName.trim();
        			System.out.println(benName);
        			try{
        				Verbindung verb = new Verbindung();
        				PreparedStatement statement = (PreparedStatement)verb.getCon().prepareStatement("SELECT nutz_name FROM nutzer WHERE nutz_name = ?");
        				statement.setString(1, benName);
        				verb.setRes(statement.executeQuery());

        				if (verb.getRes().next()) {
    						System.out.println("Nutzer");
    					}
    					else{
    						JOptionPane.showMessageDialog(null, "Sie sind kein Nutzer dieses Systems!", "Login", JOptionPane.OK_CANCEL_OPTION);
    						Frame.txtBenName.setText(null);
    					}
        			}catch(Exception ex){
        				System.out.println("Keine Verbindung: " + ex);
        			}		
        			
        			//Passwort
        			char[] pass = Frame.txtPass.getPassword();
        			String passStr = new String(pass);
        			passStr = passStr.trim();
        			System.out.println(pass);
    			
        			try{
        				Verbindung verb = new Verbindung();
        				PreparedStatement stmPass = (PreparedStatement)verb.getCon().prepareStatement("SELECT passwort FROM nutzer WHERE nutz_name = ?");
        				stmPass.setString(1, benName);
        				verb.setRes(stmPass.executeQuery());
        				if(verb.getRes().next()){
        					String passw = verb.getRes().getString(1);
        					passw = passw.trim();
        					if(count < 2){
       							if(passw.equals(passStr)){
       								System.out.println("Login erfolgreich");
       								Frame.login.setVisible(false);
       								//Frame.start1.setVisible(true);
       							}
       							else{
       								JOptionPane.showMessageDialog(null, "Sie haben ein falsches Passwort eingegeben!", "Login", JOptionPane.OK_CANCEL_OPTION);
       								count++;
       								System.out.println("Login nicht erfolgreich");
       							}
        					}
        					else{
        						JOptionPane.showMessageDialog(null, "Sie haben sich 3 Mal falsch angemeldet!", "Login", JOptionPane.OK_CANCEL_OPTION);
        						System.exit(0);
        					}
        				}
        			}catch(Exception ex){
        				System.out.println("Keine Verbindung: " + ex);
        			}	
        			
        		}
        	}
		});
		
		Frame.btAbbrechen.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent event){
				if(event.getActionCommand().equals("Abbrechen")){
					System.exit(0);
				}
			}
		});
	}
}
```


----------



## manuche (27. Jan 2009)

Kleine Anmerkung am Rande... Du solltest nicht soviele Aufrufe in einander Schachteln! Performance-technisch tut sich da nix allerdings wird es übersichtlicher und macht grade am Anfang das Denken in Objekten und dem Zusammenspiel mit Gettern und Settern einfacher!


----------



## cam (27. Jan 2009)

Also laut Debugger wird der jdbc-Treiber nicht gefunden, was aber nicht sein kann, denn wenn ich alles zurückstelle, wie der Code war, findet er den ja - also muss was mit den getter/setter falsch sein - bitte, kann sich das jemand ansehen?
Ich bin auch sofort still, wenn jemand eine Lösung findet oder sagt, alles ganz falsch.


----------



## manuche (27. Jan 2009)

> com.microsoft.sqlserver.jdbc.SQLServerStatement cannot be cast to java.sql.PreparedStatement



Eventuell einen Import falsch gemacht? Das meine ich mit der Übersichtlichkeit... Wenn du jetzt nicht alles in eine Zeile schreibst ist der Fehler meist schneler erkennbar!


----------



## cam (27. Jan 2009)

Ich schreibe doch nur in eine Zeile, was in eine Zeile gehört? Nach jedem ";" fange ich doch neu an?

Diese Fehlermeldung kommt auch bei meinem vorherigen Stand, aber das Programm funktioniert trotzdem, also alle Abfragen, woher diese Meldung kommt, tja, das habe ich nicht herausgefunden, aber auch nicht weiter gesucht, weil es funktionierte ja.


----------



## manuche (27. Jan 2009)

```
Verbindung verb = new Verbindung(); 
                    PreparedStatement statement = (PreparedStatement)verb.getCon().prepareStatement("SELECT nutz_name FROM nutzer WHERE nutz_name = ?"); 
                    statement.setString(1, benName); 
                    verb.setRes(statement.executeQuery());
```
Geht zwar, ist aber unübersichtlich...
Grade am Anfang besser:

```
Connection con = verb.getCon();
PreparedStatement pstmt = con.prepareStatement("...");
...
ResultSet result = pstmt.executeQuery();
verb.setRes(result);
```
Wie gesagt, ist nicht falsch was du gemacht hast allerdings musst du so nen paar mehr Funktionen auf Ihre Richtigkeit prüfen wenn dir der Compiler nen Fehler in einer bestimmten Zeile anzeigt!

Und bei ner Exception funktioniert eben irgendwas nicht... Nur wenn es keine RuntimeException ist läuft dein Programm weiter... 
Nullpointer Exception heisst übrigens, dass eine Referenz auf kein Objekt zeigt, du diese Referenz trotzdem benutzt.
Jetzt gilt es rauszufinden, warum die Referenz nicht auf ein Objekt zeigt!


----------



## Noctarius (27. Jan 2009)

> com.microsoft.sqlserver.jdbc.SQLServerStatement cannot be cast to java.sql.PreparedStatement



ist "com.microsoft.sqlserver.jdbc.SQLServerStatement" vielleicht kein PreparedStatement?  Ich mein es gibt ja auch nur Statement.

Wenn ich das richtig verstanden habe (bzw ex.printStackTrace() kann große Dienste beim Debugging leisten) entsteht der Fehler in Frame.java - daher schonmal versucht folgendes zu machen?

```
verb.setPrepStat(verb.getCon().prepareStatement());
```

falls der MsSql Treiber sowas kennt natürlich - Man kann eben nicht Alles in Alles zwängen


----------



## cam (27. Jan 2009)

Jetzt weiß ich, was du meinst  :wink: 
Ok, weiter geht's - danke


----------



## cam (27. Jan 2009)

@Noctarius: Du hast recht, wenn ich "nur" Statement nehme, wird eine Verbindung hergestellt, also zumindest die erste Fehlermeldung verschwindet.

Aber beim Login bleiben die Fehlermeldungen, da hab ich ja auch noch PreparedStatements. Es wurde mir doch aber von vielen geraten, PreparedStatements zu nutzen? Soll ich jetzt doch wieder nur Statements nehmen???


----------



## cam (27. Jan 2009)

Das letzte ist quatsch, also die Verbindung nur mit Statement, das ist schon richtig, aber der Rest sollte auch mit PreparedStatement gehen.


----------



## manuche (27. Jan 2009)

Ich denke es wird an den Imports liegen... 
Es kann zwei Klassen PreparedStatement in unterschiedlichen Packages geben! Und da ist es dann höchst wahrscheinlich nicht möglich zu casten!


----------



## cam (27. Jan 2009)

Ich hab als Import "java.sql.PreparedStatement"
Das hab ich auch bei der alten Version und da funktioniert es...
Ich such mal weiter...


----------



## manuche (27. Jan 2009)

Iwie hab ich den Überblick verloren... Ich gehe noch von den Sourcen von der ersten Seite aus!
In welcher Zeile welcher Klasse tritt da jetzt der Fehler aus und was steht in der Exception?


----------



## cam (27. Jan 2009)

Meldung:

Verbindung hergestellt.
Demo
Keine Verbindung (Benutzername): java.lang.NullPointerException
demo
Keine Verbindung (Passwort): java.lang.NullPointerException

Wird aus der Login.java kommen.


----------



## cam (27. Jan 2009)

Login.java:


```
package forms;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.swing.JOptionPane;

public class Login {

	public static void login() {		
		
		/**
		 * Prüfen, ob Passwort richtig
		 */
    
		Frame.btAnmelden.addActionListener(new ActionListener(){
        	int count = 0;
        	public void actionPerformed(ActionEvent event){
        		if(event.getActionCommand().equals("Anmelden")){
        			
    				//Benutzername
        			String benName = Frame.txtBenName.getText();
        			benName = benName.trim();
        			System.out.println(benName);
        			try{
        				Verbindung verb = new Verbindung();
        				Connection con = verb.getCon();
        				PreparedStatement statement = con.prepareStatement("SELECT nutz_name FROM nutzer WHERE nutz_name = ?");
        				statement.setString(1, benName);
        				ResultSet result = statement.executeQuery();
        				verb.setRes(result);

        				if (verb.getRes().next()) {
    						System.out.println("Nutzer");
    					}
    					else{
    						JOptionPane.showMessageDialog(null, "Sie sind kein Nutzer dieses Systems!", "Login", JOptionPane.OK_CANCEL_OPTION);
    						Frame.txtBenName.setText(null);
    					}
        			}catch(Exception ex){
        				System.out.println("Keine Verbindung (Benutzername): " + ex);
        			}		
        			
        			//Passwort
        			char[] pass = Frame.txtPass.getPassword();
        			String passStr = new String(pass);
        			passStr = passStr.trim();
        			System.out.println(pass);
    			
        			try{
        				Verbindung verb = new Verbindung();
        				Connection con = verb.getCon();
        				PreparedStatement stmPass = con.prepareStatement("SELECT passwort FROM nutzer WHERE nutz_name = ?");
        				stmPass.setString(1, benName);
        				ResultSet result = stmPass.executeQuery();
        				verb.setRes(result);
        				if(verb.getRes().next()){
        					String passw = verb.getRes().getString(1);
        					passw = passw.trim();
        					if(count < 2){
       							if(passw.equals(passStr)){
       								System.out.println("Login erfolgreich");
       								Frame.login.setVisible(false);
       								//Frame.start1.setVisible(true);
       							}
       							else{
       								JOptionPane.showMessageDialog(null, "Sie haben ein falsches Passwort eingegeben!", "Login", JOptionPane.OK_CANCEL_OPTION);
       								count++;
       								System.out.println("Login nicht erfolgreich");
       							}
        					}
        					else{
        						JOptionPane.showMessageDialog(null, "Sie haben sich 3 Mal falsch angemeldet!", "Login", JOptionPane.OK_CANCEL_OPTION);
        						System.exit(0);
        					}
        				}
        			}catch(Exception ex){
        				System.out.println("Keine Verbindung (Passwort): " + ex);
        			}	
        			
        		}
        	}
		});
		
		Frame.btAbbrechen.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent event){
				if(event.getActionCommand().equals("Abbrechen")){
					System.exit(0);
				}
			}
		});
	}
}
```


----------



## manuche (27. Jan 2009)

Schreib in deine catch-Blöcke mal immernoch ex.printStackTrace() und dann sag was er da ausgibt!
So bekommst du die Funktionsaufrufe mit und in welcher Zeile sich der Fehler in welcher Funktion befindet...
Ggf dann nochmal entsprechenden Code zeigen, bitte!


----------



## cam (28. Jan 2009)

Also jetzt kommen folgende Meldungen:



> Verbindung hergestellt.
> Demo
> Keine Verbindung (Benutzername): java.lang.NullPointerException
> java.lang.NullPointerException
> ...


----------



## cam (28. Jan 2009)

Im angegebenen Code Zeilen 32 und 57.


----------



## Ebenius (28. Jan 2009)

Jetzt musst Du natürlich die beiden StackTraces durchlesen, um herauszufinden was nicht funktioniert: 





			
				cams Konsole hat gesagt.:
			
		

> at forms.Login$1.actionPerformed(Login.java:38)
> [...]
> at forms.Login$1.actionPerformed(Login.java:64)



Dann musst Du in beiden Zeilen in Login.java nachgucken und findest damit heraus welche Objekte null waren. Was steht denn in Deinem Source-Code in Login.java an Zeile 38 und 64? Wenn Du dort nachschaust, hast Du bestimmt schon selbst eine Idee was da schief geht, oder? Mitmachen und mitdenken bitte!

Ebenius


----------



## Ebenius (28. Jan 2009)

In den beiden Zeilen steht: 
	
	
	
	





```
PreparedStatement stmPass = con.IRGENDWAS(...);
```
Wenn da eine NullPointerException auftritt, dann ist "con" null. Du schaust Dir an, wo das "con" herkommt: 
	
	
	
	





```
Verbindung verb = new Verbindung(); 
Connection con = verb.getCon();
```
Und nun weißt Du, dass von "verb.getCon()" null zurückgegeben wird. Und jetzt musst Du rausfinden, warum das so ist...


----------



## manuche (28. Jan 2009)

Damit wäre wohl klar, dass das Problem in der Klasse Verbindung besteht.
Über die Instanz dieser Klasse holst du dir ein Connection-Objekt welches du mit con.prepareStatement(...) benutzt...
da con allerdings null ist, wird eine NullPointerException geworfen!
Einfaml den Code der Klasse Verbindung bitte!


----------



## cam (28. Jan 2009)

Ich nehme an, dass es am PreparedStatement liegt. Ich weiß aber nicht warum, weil in meinem alten Code funktioniert es ja - also mit meinen public static Variablen. Da hab ich den Verbindungsaufbau auch mit Statement und die Abfragen mit PreparedStatement.


----------



## Ebenius (28. Jan 2009)

cam hat gesagt.:
			
		

> Ich nehme an, dass es am PreparedStatement liegt. Ich weiß aber nicht warum, weil in meinem alten Code funktioniert es ja - also mit meinen public static Variablen. Da hab ich den Verbindungsaufbau auch mit Statement und die Abfragen mit PreparedStatement.


Liest Du was ich schreibe und denkst Du mit? con ist null. Es liegt also nicht am Statement, sondern an der Verbindung...


----------



## cam (28. Jan 2009)

Verbindung.java:


```
package forms;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class Verbindung {

	private Connection cn = null;
	private PreparedStatement statement = null;
	private ResultSet rs = null;
	private Statement st = null;
	
    public Connection getCon(){
    	return cn;
    }

	public void setCon(Connection cn) {
		this.cn = cn;
	}
	
	public PreparedStatement getPrepStat(){
		return statement;
	}
	
	public void setPrepStat(PreparedStatement statement){
		this.statement = statement;
	}
	
	public ResultSet getRes(){
		return rs;
	}
	
	public void setRes(ResultSet rs){
		this.rs = rs;
	}
	
	public Statement getStat(){
		return st;
	}
	
	public void setStat(Statement st){
		this.st = st;
	}
}
```


----------



## SlaterB (28. Jan 2009)




----------



## cam (28. Jan 2009)

@Ebenius: Entschuldige, ich habe aber übersehen, dass es schon eine 3. Seite gibt.


----------



## Ebenius (28. Jan 2009)

Jetzt schau Dir Deine Klasse Verbindung an. Dort ist "cn" immer null, es sei denn jemand ruft die setCon()-Methode auf. Wer tut das wo und warum ist es nicht passiert, bevor Du auf die Verbindung zugreifst?


----------



## manuche (28. Jan 2009)

Guck dir mal die getCon-Methode an.... Da gibst du die Membervariable cn zurück. Diese wird aber IMMER mit null initialisiert es sei den sie wird mit der setCon-Methode mal gesetzt, was allerdings nicht in der Klasse Login geschieht!!!


----------



## cam (28. Jan 2009)

Ok, das kann ich nachvollziehen, dass cn null ist.

In Frame.java habe ich ja setCon() damit funktioniert dort auch getCon().


```
verb.setCon(DriverManager.getConnection("jdbc:sqlserver://localhost; databaseName = Lager; user = sa; password = xxx"));
```

Ich weiß aber nicht, was ich für Parameter in Login.java übergeben soll?


----------



## manuche (28. Jan 2009)

Folgender Vorschlag: Du verwendest das gleiche Objekt der Klasse Verbindung, welches du in der Frameklasse hast auch in der Klasse Login!


----------



## cam (28. Jan 2009)

Oh man, das gibt es doch nicht!!!!
Das hatte ich vorhin ausprobiert, aber versehentlich nur beim Benutzernamen und nicht beim Passwort und dadurch kam ja weiterhin die Fehlermeldung   

Vielen vielen Dank!!!!!!

Jetzt noch eine allerletzte Frage dazu:

Ist das so mit den getter/setter richtig? Also soll ich das so durch das ganze Programm machen?


----------



## manuche (28. Jan 2009)

Das ist das Konzept von OO-Programmiersprachen... Nennt sich Information-Hiding! Der Zugriff geschieht über Getter- und Setter-Methoden!
Ausnahmen gibt es zwar auch allerdings solltest du damit erst anfangen wenn es wirklich nicht anders geht... Darfst uns dann aber fragen ob es wirklich nicht anders geht 

Btw kannst du parameterisierte Konsturktoren verwenden...


```
public class Verbindung{
  private Connection cn;
  ...

  public Verbindung (Connection cn){
    this.cn = cn;
  } 

  ...
}
```
Dann brauchst du nur noch fogenden Aufruf:

```
Connectnon con = Class.forName(...);
Verbindung verb = new Verbindung (con);
```
statt

```
Connectnon con = Class.forName(...);
Verbindung verb = new Verbindung ();
ver.setCon (con);
```


----------



## cam (28. Jan 2009)

Ok, danke.

Na gut, eine Frage hab ich doch noch  :wink: 
Ich habe ja nun eine Menge Formulare in meinem Programm. Die habe ich alle in Frame.java angelegt. Die sind ja nun auch alle static, also Buttons usw.

Wäre es besser, die Teile alle in den jeweiligen Klassen anzulegen und nur dass jeweilige JInternalFrame an die JDesktopPane übergeben? (Geht das überhaupt? Der Gedanke kam mir nur gerade.)


----------



## manuche (28. Jan 2009)

Du brauchst dringend ein Einführung in Java bevor du mit JDesktopPanes und JInternalFrames anfängst... (nichts für ungut)
Es ist aber immer die bessere Variante auf static zu verzichten wenn es geht (und es geht fast immer)!


----------



## cam (28. Jan 2009)

Ja, hab ich auch gemerkt *seufz* Bin auch fleißig am Lesen und Probieren (schon seit Wochen), aber wie du und alle anderen ja seht, fehlt bei mir bei vielem das Verständnis.

Naja, ich hatte das Programm ja fast fertig, also meine Formulare stehen alle schon und zum größten Teil funktioniert das Programm auch, wollte es eben verbessern.

Also mache ich das nach dem gleichen Prinzip.


----------



## manuche (28. Jan 2009)

Ohne zu wissen was genau du unter Formularen verstehst und wie die in dein Programm eingebunden sind oder wie dein Programm letztendlich funktioniert...

...JA, unbedingt!


----------



## Ebenius (28. Jan 2009)

Zum Lernen: Nimm Dir ein vernünftiges Java-Buch (ob online oder Papier ist egal) und lies das ganze Buch von vorn bis hinten. Mach alle Beispiele mit, auch die die zu einfach erscheinen. Mach nicht den Fehler, Seiten zu überblättern, weil Du Dinge schon kennst. Im Notfall liest Du halt einen langweiligen Teil mit, obwohl Du das Thema schon kennst, so what? Buch-Empfehlungen findest Du sicher über die Forensuche.

Viel Erfolg!
Ebenius


----------



## cam (28. Jan 2009)

Werde ich machen.
Danke!


----------



## cam (28. Jan 2009)

Was übergibt man denn bei Buttons?


```
formsLogin.setBtAnmelden(???);
```


```
public JButton getBtAnmelden() {
		return btAnmelden;
	}

	public void setBtAnmelden(JButton btAnmelden) {
		this.btAnmelden = btAnmelden;
	}
```


----------



## Ebenius (28. Jan 2009)

cam hat gesagt.:
			
		

> Was übergibt man denn bei Buttons?


Einen Button vielleicht? ;-) Eventuell so:

```
final JButton button = new JButton("Anmelden");
formsLogin.setBtAnmelden(button);
```


----------



## cam (28. Jan 2009)

Also heißt das, dass ich alle Buttons, Labels usw. in der jeweiligen Klasse deklariere und das mit final? Und die getter und setter Methoden in der gleichen Klasse habe?
Weil so, wie ich das jetzt habe, funktioniert das nicht, wie du geschrieben hast.


----------



## Ebenius (28. Jan 2009)

cam hat gesagt.:
			
		

> Also heißt das, dass ich alle Buttons, Labels usw. in der jeweiligen Klasse deklariere und das mit final? Und die getter und setter Methoden in der gleichen Klasse habe?
> Weil so, wie ich das jetzt habe, funktioniert das nicht, wie du geschrieben hast.


Ääääääähm. Öööööh...  ???:L

Das heißt es mal sicher nicht. Ich weiß nicht, an welcher Stelle Du die Buttons wie aufbauen möchtest. Ich hab nur fix hingeschrieben, wie man das macht. Ich würde überhaupt nicht für jede Variable eine get() und eine set()-Methode machen. Das macht man nur für die bei denen es Sinn ergibt.

Vielleicht doch erstmal ein Buch?  :###

Ebenius


----------



## manuche (28. Jan 2009)

Stopp.... Ich glaube das geht grad in die falsche Richtung!
Was hast du genau vor? Was ist gegeben? und was ist dein Ziel?
Wir springen hier grade in die GUI-Programmierung... Die ist zwar auch OO allerdings ein wenig "statischer"!


----------



## cam (28. Jan 2009)

Naja, deswegen hab ich ja vorhin gefragt, ob ich die ganzen Buttons usw. auch auf diese Art und Weise (getter/setter) benutzen soll, oder kann ich die public static lassen?
Weil ganz ehrlich, ich verstehe den Sinn immer noch nicht. Bisher habe ich nur festgestellt, dass es mehr Aufwand ist. Wenn ich dann zu Hause bin, werde ich noch einmal ein paar Bücher durchgucken, vielleicht macht es irgendwann mal klick.


----------



## cam (28. Jan 2009)

Also ich habe ein Anmeldeformular, danach erscheint das Hauptmenü mit Funktionstastenbelegung - bei F1 z.B. erscheint die Einlagerungsmaske usw.


----------



## manuche (28. Jan 2009)

Bisschen mehr darfs schon sein... Wie möchtest du das aufbauen... was bentutzt du usw!


----------



## cam (28. Jan 2009)

Es soll eine Lagerverwaltung werden. Die Masken müssen öfter aufgerufen werden können und es soll Hauptsächlich mit Funktionstasten gearbeitet werden. (Als Datenbank wird MSSQL benutzt, für Java Eclipse Ganymede.)
Jedesmal, wenn eine Aktion beendet wurde, z.B. eine Box fertig eingelagert wurde, soll das Hauptmenü angezeigt werden. Beim Einlagern wird dann zwischendrin noch abgefragt, welche Größe die Box hat und ob der vorgeschlagene Einlagerungsplatz genommen werden soll. Ach ja und wenn es für bestimmte Artikel Lieferanten gibt, müssen diese auch ausgewählt werden.


----------



## Schandro (28. Jan 2009)

GUI Komponente brauchen zwar meist kein getter/setter (gibt ausnhamen), static sollten sie aber auch nicht sein. Eine GUI Klasse die komplett statich arbeitet ist zwar machbar, aber meiner Meinung nach echt kein guter Stil.


----------



## cam (28. Jan 2009)

Aber warum verlangt Eclipse ständig static?


----------



## SlaterB (28. Jan 2009)

static (main-Methode) ist der einfache nicht-objektorientiere Anfang von allem,
die Fehlermeldungen lauten dann weder 'ey, mach mal Objekte' noch 'hier brauchts entweder static oder Objekte', 
sondern nüchtern schlicht 'von static aus kann man auf static zugreifen',

dass es generell besser ist, Objekte zu erstellen, lernt man an einem Tag richtigen Java-Lernens, 
dass muss der Compiler nicht Jahrzehnte lang predigen


----------



## Ebenius (28. Jan 2009)

Herrje... Das mit dem Buch wird wohl nicht ernst genommen. :roll:


----------

