# Wie gehe ich korrekt vor?



## Guest (29. Dez 2008)

Hi leute, aufgrund eines Projektes muss ich mir viel im Umgang mit Datenbanken und JAVA selbst beibringen und hab jetz ne "Testklasse" geschrieben.
Nur weiss ich noch nicht wie ich das mit der GUI verknüpf...
evtl. könnt ihr mir ja helfen!
Ich möchte das die Adressen ausgegeben werden, wenn ich auf den Button klick!
Die 2 Klassen miteinander zu verbinden krieg ich grad nicht hin...wenn ihr den code anschaut versteht ihr sicher mein noobiges prob....
thx schonmal...


```
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

//Programmierung der Benutzeroberfläche
public class TestKlasse extends JFrame{
		
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JButton knopf;
	private JLabel label, label2;
	private JPanel labelpanel, buttonpanel;
	private JTextField edit;
	
	public TestKlasse(){
		
		super();
		this.setTitle("AJ's");
		knopf = new JButton("Drück mich");
		label = new JLabel("LABEL",JLabel.CENTER);
		label2 = new JLabel("LABEL2", JLabel.CENTER);
		labelpanel = new JPanel();
		edit 	= new JTextField(15);
		
		
		
		
		labelpanel.setLayout(new GridLayout(2,1));
		labelpanel.add(label);
		labelpanel.add(label2);
		
		
		buttonpanel = new JPanel();
		buttonpanel.setLayout(new BorderLayout());
		buttonpanel.add(knopf, BorderLayout.CENTER);
		
		
		
		
		this.getContentPane().setLayout( new BorderLayout() );
		this.getContentPane().add(labelpanel, BorderLayout.NORTH);
		this.getContentPane().add(buttonpanel,BorderLayout.SOUTH);
		this.getContentPane().add(edit, BorderLayout.CENTER);
		
		knopf.addActionListener(new Ohr());
		
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	
	class Ohr implements ActionListener{
		
		
		public void actionPerformed(ActionEvent e){
			
//			if(e.getActionCommand()== knopf.getActionCommand())
//				label.setText(edit.getText());
//			HIER SOLLTE DIE ABFRAGE DES BUTTONS REIN!
				
			
		}
		
	}

	
	
	
	
	
	
	
//Die Datenbankanbindung und die Befehle hierfür
		 public static void main(String[] args)
		    throws SQLException, ClassNotFoundException {	
			 
		TestKlasse f 	= new TestKlasse();
		f.setSize(200, 200);
		f.setLocation(700, 400);
		f.setVisible(true);	 
		
		
		
		
			 
		try {
	        Class.forName("org.hsqldb.jdbcDriver" );
	    } catch (Exception e) {
	        System.out.println("ERROR: failed to load HSQLDB JDBC driver.");
	        e.printStackTrace();
	        return;
	    	}
	    
	    Connection con	= null;
	   
	    try{
	    	con = DriverManager.getConnection("jdbc:hsqldb:hsql://192.168.0.42/TrinityTest", "sa", "");
	    }catch(SQLException e){
	    	System.out.println("Keine Verbindung!");
	    	}
	    
	    
	    Statement state = null;
	    try{	   
	    	state = con.createStatement();
	    }catch (SQLException e){
	    	System.out.println("Kann kein Statement erzeugen");	
	    }
	    
	    //Die DB-Verbindung ist nun hergestellt! Folgt SQL Statement 
	    
	    String sql 	= "SELECT * FROM ADRESSEN;";
	    
	    try{
	    	ResultSet res 	= state.executeQuery(sql);	
	    	while(res.next())
	    	{
	    		int firmanr =	res.getInt("FIRMANR");
	    		String firmatext	=		res.getString("FIRMATEXT");
	    		
	    		System.out.println(firmanr + " " + firmatext);
	    	}
	    		
	    			    		
	    }catch(SQLException e){
	    	System.out.println("Der Query ist Fehlerhaft");
	    }
	    
	    

	    }
	
}
```


----------



## AJRames (29. Dez 2008)

edit: der Thread ist von mir, hab vergessen mich vorher anzumelden...


----------



## AJRames (29. Dez 2008)

Habs jetz umgebaut, müsste richtiger sein...trotzdem krieg ichs nicht hin das Ergebnis ins JTextField zu schreiben...


```
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

//Programmierung der Benutzeroberfläche
public class TestKlasse extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JButton knopf;
	private JLabel label, label2;
	private JPanel labelpanel, buttonpanel;
	private JTextField edit;

	public TestKlasse() {

		super();
		this.setTitle("AJ's");
		knopf = new JButton("Drück mich");
		label = new JLabel("LABEL", JLabel.CENTER);
		label2 = new JLabel("LABEL2", JLabel.CENTER);
		labelpanel = new JPanel();
		edit = new JTextField(15);

		labelpanel.setLayout(new GridLayout(2, 1));
		labelpanel.add(label);
		labelpanel.add(label2);

		buttonpanel = new JPanel();
		buttonpanel.setLayout(new BorderLayout());
		buttonpanel.add(knopf, BorderLayout.CENTER);

		this.getContentPane().setLayout(new BorderLayout());
		this.getContentPane().add(labelpanel, BorderLayout.NORTH);
		this.getContentPane().add(buttonpanel, BorderLayout.SOUTH);
		this.getContentPane().add(edit, BorderLayout.CENTER);

		knopf.addActionListener(new Ohr());

		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	class Ohr implements ActionListener {

		public void actionPerformed(ActionEvent x) {

			if (x.getActionCommand() == knopf.getActionCommand()) {
				
				//DB Verbindung Herstellen
				try {
					Class.forName("org.hsqldb.jdbcDriver");
				} catch (Exception e) {
					System.out.println("ERROR: failed to load HSQLDB JDBC driver.");
					e.printStackTrace();
					return;
				}

				Connection con = null;

				try {
					con = DriverManager.getConnection(
							"jdbc:hsqldb:hsql://192.168.0.42/TrinityTest",
							"sa", "");
				} catch (SQLException e) {
					System.out.println("Keine Verbindung!");
				}

				Statement state = null;
				try {
					state = con.createStatement();
				} catch (SQLException e) {
					System.out.println("Kann kein Statement erzeugen");
				}

				String sql = "SELECT * FROM ADRESSEN;";

				try {
					ResultSet res = state.executeQuery(sql);
					while (res.next()) {
						int firmanr = res.getInt("FIRMANR");
						String firmatext = res.getString("FIRMATEXT");

						//System.out.println(firmanr + " " + firmatext);
						TestKlasse f = new TestKlasse();
						f.edit.setText(firmatext);
						//f.label2.setText(firmatext);
						
					}

				} catch (SQLException e) {
					System.out.println("Der Query ist Fehlerhaft");
				}
			}

		}

	}

	// Die Datenbankanbindung und die Befehle hierfür
	public static void main(String[] args) throws SQLException,
			ClassNotFoundException {

		TestKlasse f = new TestKlasse();
		f.setSize(200, 200);
		f.setLocation(700, 400);
		f.setVisible(true);

	}

}
```


----------



## ARadauer (29. Dez 2008)

```
while (res.next()) { 
                  int firmanr = res.getInt("FIRMANR"); 
                  String firmatext = res.getString("FIRMATEXT"); 

                  //System.out.println(firmanr + " " + firmatext); 
                  TestKlasse f = new TestKlasse(); 
                  f.edit.setText(firmatext); 
                  //f.label2.setText(firmatext); 
                   
               }
```

für jede zeile in der db erstellt du ein neues objekt von TestKlasse, und setzt in ein textfeld einen Wert. Warum sollte dieser wert dann in diesem Objekt sichtbar werden?


```
TestKlasse f = new TestKlasse(); 
      f.setSize(200, 200); 
      f.setLocation(700, 400); 
      f.setVisible(true);
```

so funktioniert sowas.. ungefähr... moment


----------



## ARadauer (29. Dez 2008)

```
package test3;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class TestKlasse extends JFrame { 

   /** 
    * 
    */ 
   private static final long serialVersionUID = 1L; 
   private JButton knopf; 
   private JLabel label, label2; 
   private JPanel labelpanel, buttonpanel; 
   private JTextField edit; 

   Ohr ohr;

   public TestKlasse() { 

      super(); 
      this.setTitle("AJ's"); 

      ohr = new Ohr();
      knopf = new JButton("Drück mich"); 
      label = new JLabel("LABEL", JLabel.CENTER); 
      label2 = new JLabel("LABEL2", JLabel.CENTER); 
      labelpanel = new JPanel(); 
      edit = new JTextField(15); 

      labelpanel.setLayout(new GridLayout(2, 1)); 
      labelpanel.add(label); 
      labelpanel.add(label2); 

      buttonpanel = new JPanel(); 
      buttonpanel.setLayout(new BorderLayout()); 
      buttonpanel.add(knopf, BorderLayout.CENTER); 

      this.getContentPane().setLayout(new BorderLayout()); 
      this.getContentPane().add(labelpanel, BorderLayout.NORTH); 
      this.getContentPane().add(buttonpanel, BorderLayout.SOUTH); 
      this.getContentPane().add(edit, BorderLayout.CENTER); 

      knopf.addActionListener(new ActionListener(){
         @Override
         public void actionPerformed(ActionEvent e) {
            edit.setText(ohr.loadFirma());            
         }         
      }); 

      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
   } 

   public static void main(String[] args) { 

      TestKlasse f = new TestKlasse(); 
      f.setSize(200, 200); 
      f.setLocation(700, 400); 
      f.setVisible(true); 

   } 
}
```



```
package test3;

import java.awt.event.ActionListener;

public class Ohr { 

   public String loadFirma() { 

        
//         //DB Verbindung Herstellen 
//         try { 
//            Class.forName("org.hsqldb.jdbcDriver"); 
//         } catch (Exception e) { 
//            System.out.println("ERROR: failed to load HSQLDB JDBC driver."); 
//            e.printStackTrace(); 
//            return; 
//         } 
//
//         Connection con = null; 
//
//         try { 
//            con = DriverManager.getConnection( 
//                  "jdbc:hsqldb:hsql://192.168.0.42/TrinityTest", 
//                  "sa", ""); 
//         } catch (SQLException e) { 
//            System.out.println("Keine Verbindung!"); 
//         } 
//
//         Statement state = null; 
//         try { 
//            state = con.createStatement(); 
//         } catch (SQLException e) { 
//            System.out.println("Kann kein Statement erzeugen"); 
//         } 
//
//         String sql = "SELECT * FROM ADRESSEN;"; 
//
//         try { 
//            ResultSet res = state.executeQuery(sql); 
//            while (res.next()) { 
//               int firmanr = res.getInt("FIRMANR"); 
//               String firmatext = res.getString("FIRMATEXT"); 

               return "nur ein Test, hab ja deine db nicht";

            
//                
//            } 
//
//         } catch (SQLException e) { 
//            System.out.println("Der Query ist Fehlerhaft"); 
//         } 
//      } 
   }

}
```

in der ohr klasse hab ich alles auskommentiert, damit es bei mir kompeliert... ich hab ja jetzt die db nicht

also so ungefähr, ich würde den db zugriff in deiner DB Klasse (Ohr) komplett unabhängig von der gui machen...


```
if (x.getActionCommand() == knopf.getActionCommand()) {
```
bei sowas muss eine db klasse genau wissen wie deine gui aussieht (knopf kennen) das is nicht gut...

man kann die ganze sache noch viel besser trennen. man hat eine zentrale steuerung (controller) der commandos von der gui entgegennimmt und mit diesen ein model (das die daten repräsentiert) manipuliert. bei änderung des models wird die view informiert, die sich automatisch aktualisiert.... mvc pattern, dao pattern, observer pattern... sind hier vielleicht mal interessant... aber ich denk für den anfang reichts, wenn du verstehst das dieses  
TestKlasse f = new TestKlasse();  aus Zeile    113  nicht das aus  Zeile 94 es sind zwar die selben Klassen, aber zwei unterschiedlich objekte... Zwei Hunde aber wenn ich Bello fütterne ist das Rex egal ;-)


----------



## AJRames (30. Dez 2008)

Ah alles klar! Jep, mir ist halt nichts anderes eingefallen, darum hab ich das zweite objekt erstellt...aber klar, ist schwachsinn!

Prinzipiell ists dann wohl auch besser wenn ich die Buttons so abfrag:


```
knopf.addActionListener(new ActionListener(){
         @Override
         public void actionPerformed(ActionEvent e) {
            edit.setText(ohr.loadFirma());           
         }
```

ich hätte mir jetz angewöhnt das immer mit den if abfragen zu machen. Aber ich find das von dir übersichtlicher!
Wenn ich das so mache, dann müsste ich in der Ohr Klasse, für jeden Button dann auch ne eigene Methode machen die dann ausgeführt wird, richtig?

So wird mir jetz langsam das Gesamtkonzept klarer!
Hast mir sehr geholfen!!!
Danke!!

Gruß AJ


----------



## AJRames (30. Dez 2008)

Hm, habs grad so versucht wie du es zeigst...aber nun hab ich das Problem das ich da nur einen Datensatz angezeigt bekomme in der TextArea...trotz der while schleife...Warum? Wie kann ich das ändern?

Selbst wenn ich es mit edit.append oder edit.insert versuche...

Gruß AJ


----------



## Guest (31. Dez 2008)

Vielleicht, weil die Schleife mit return verlassen wird.


----------



## AJRames (1. Jan 2009)

Ok, die schleife wird mit return verlassen...
Wie kriege ich es nun hin das er trotzdem alle Daten aus der DB ausgibt die ich brauche?
Ich kriegs nicht hin


----------

