Wo in GUI-Klasse bringe ich Quellcode unter?

  • Themenstarter Themenstarter Henning Rüther
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
H

Henning Rüther

Gast
Ich bins nochmal, habe nachgedacht, und dabei ist eine neue Frage aufgetaucht:

Ich habe eine Datenbank-Klasse (ohne main) wo ich funktionen zum datenbankzugriff erstellt habe und dann bislang eine Frontend-Klasse (mit main), wo ich nun Datenbankabfragen initieren und die Ergebnisse in zur Laufzeit erzeugten ComboBoxes anbieten möchte. Funktioniert auch in Bezug auf die Datenbank wunderbar.

Meine Frage ist nun, wo in meiner Frontend-Klasse bringe ich den Code unter? Alles Probieren hat leider nichts geholfen, und ein passendes Tutorial konnte ich auch noch nicht finden. Es ist ja sicherlich nicht elegant, alles in die eine Main-Funtion zu stecken. Außerdem ist die ja, wie ich gerade gelernt habe static, und kann daher auch nur auf static-Komponenten zugreifen. Wie denn aber dann?

Innerhalb meiner Frontend-Klasse eine Funtion aufzumachen klappt ja auch nicht so einfach, denn die muss dann scheinbar auch wieder static sein, wenn ich sie von Main aus aufrufen will...

Ich brauche glaube ich nur einen Denkanstoß, wo bzw. wie ich den eigentlichen Quellcode unterbringen kann. Ich muss ja Zugriff auf die Komponenten der GUI haben, daher kann ich ja auch nicht in eine andere Klasse ausweichen, oder?

Gruß Henning
 
Du schreibst, du hast eine Datenbank-Klasse ohne main. Wie sollen wir das verstehen?

Erzeugst du irgendwo eine Instanz dieser Klasse? Oder hast du alle Methoden static?

Dann ist der Ansatz erstmal gründlich zu überdenken.

Henning Rüther hat gesagt.:
Innerhalb meiner Frontend-Klasse eine Funtion aufzumachen klappt ja auch nicht so einfach, denn die muss dann scheinbar auch wieder static sein, wenn ich sie von Main aus aufrufen will...

Warum willst du sie denn von Main aus aufrufen? Warum nicht durch eine Instanz der Datenbank-Klasse?

Henning Rüther hat gesagt.:
IIch muss ja Zugriff auf die Komponenten der GUI haben, daher kann ich ja auch nicht in eine andere Klasse ausweichen, oder?

Der übliche Ansatz ist, daß die Instanz der Klasse die die GUI-Komponenten besitzt, eine Instanz
deiner Front-End-Klasse kennt, über die die Methoden dann aufgerufen werden können.

Problem ist, daß wir keine Ahnung haben, wie dein Programm aufgebaut ist.

Kannst du nicht den Teil des Codes posten, der die GUI-Komponenten erzeugt und verwaltet?

Die Methoden-Inhalte und gesamten Datenbankzugriffe sind dabei nicht von Belang. Es geht
nur darum zu sehen, wo was static oder nicht-static definiert ist.

Ansonsten ist es praktisch unmöglich dir irgendwelche Tips zu geben.
 
hmm....du solltest dich vll mal mit dem MVC-Prinzip beschaeftigen. Die Klasse Observabel und das Interface Observer eignen sich da zum Beispiel ganz gut zur Umsetzung. Die main-Methode sollte nicht unbedingt in deiner GUI-Klasse stehen....am Besten eignet sich da meist eine eigene kleine Klasse.
 
Vielleicht ist es wirklich einfacher, wenn ich etwas Code poste... Ist ja nichts Geheimes, aber ich wollte nicht unnötig viel "Lesestoff" hier einfügen...

Dies ist meine Datenbankklasse:

Code:
import java.sql.BatchUpdateException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
   
   public class Derby {
  
      /**
       * Verbindung zur Datenbank
       */
      Connection connection;
  
      /**
       * JDBC-Treiber-Name. Muss im Klassenpfad sein.
       */
      static final String DRIVER 
          = "org.apache.derby.jdbc.EmbeddedDriver";
      
      /**
       * Verbindungs-URL. Erstellt beim ersten Aufruf eine neue Datenbank.
       */
      static final String URL 
          = "jdbc:derby:c:/TuchenhagenKHDB/KHDB;create=true";
      
      ArrayList inhaltListe = new ArrayList();
      ArrayList nextLevelBezeichnungListe = new ArrayList();
      
      public ArrayList inhaltAbfrage() { return inhaltListe; }
      
      public ArrayList nextLevelBezeichnungAbfrage() { return nextLevelBezeichnungListe; }
      
            
      /**
       * Verbindung zur Datenbank herstellen. 
       */
      public void connect() {
            /*...*/
      }
      
      /**
       * Verbindung trennen
       */
      public void disconnect() {
            /*...*/
      }

      /**
       * Tabellen erzeugen
       */
      public void createTables() {
            /*...*/	  
      }      
      
      /**
       * Knoten erzeugen
       */
      public void createNode(int jNodeLevel, int jParentId, int jUserLevel, String jKeywordGerman, String jKeywordEnglish, String jNextLevelGerman, String jNextLevelEnglish) {
             /*...*/
      }  

      /**
       * Eine bestimmte Ebene (Level) anzeigen
       */
      public void showLevel(int jNodeLevel, int jParentId, int jUserLevel) {
            /*...*/
      }
      
   }

Und dies hier ist im Augenblick meine Frontendklasse:



Code:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.GridLayout;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.KeyStroke;


public class FrontendGUI01 extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JMenuBar jJMenuBar = null;
	private JMenu fileMenu = null;
	private JMenu editMenu = null;
	private JMenu helpMenu = null;
	private JMenuItem exitMenuItem = null;
	private JMenuItem aboutMenuItem = null;
	private JMenuItem copyMenuItem = null;
	private JMenuItem saveMenuItem = null;
	private JMenuItem germanMenuItem = null;
	private JMenuItem englishMenuItem = null;
	private JPanel jPanel = null;
	private JProgressBar jProgressBar = null;
	private JPanel jPanel1 = null;
	private JComboBox LeveljComboBox = null;
	
	/**
	 * This method initializes jPanel	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel() {
		if (jPanel == null) {
			GridLayout gridLayout = new GridLayout();
			gridLayout.setRows(2);
			jPanel = new JPanel();
			jPanel.setBackground(java.awt.SystemColor.window);
			jPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(0,0,0,0));
			jPanel.setLayout(gridLayout);
			jPanel.setPreferredSize(new java.awt.Dimension(100,100));
		}
		return jPanel;
	}

	/**
	 * This method initializes jProgressBar	
	 * 	
	 * @return javax.swing.JProgressBar	
	 */
	private JProgressBar getJProgressBar() {
		if (jProgressBar == null) {
			jProgressBar = new JProgressBar();
			jProgressBar.setPreferredSize(new java.awt.Dimension(148,16));
			jProgressBar.setBackground(java.awt.SystemColor.window);
		}
		return jProgressBar;
	}

	/**
	 * This method initializes jPanel1	
	 * 	
	 * 
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel1() {
		if (jPanel1 == null) {
			jPanel1 = new JPanel();
			jPanel1.setPreferredSize(new Dimension(100, 100));
			jPanel1.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
			jPanel1.setLayout(null);
			jPanel1.setBackground(SystemColor.window);
			jPanel1.add(LeveljComboBox(), null);
		}
		return jPanel1;
	}

	/**
	 * This method initializes LeveljComboBox	
	 * 	
	 * @return javax.swing.JComboBox	
	 */
	private JComboBox LeveljComboBox() {
		if (LeveljComboBox == null) {
			LeveljComboBox = new JComboBox(new String[] {"Produkt?"});
			LeveljComboBox.setBounds(new java.awt.Rectangle(14,14,666,19));
			LeveljComboBox.setBackground(java.awt.SystemColor.window);

			[b]Derby derby = new Derby();
			derby.connect();
			derby.showLevel(1,0,0);
			derby.disconnect();[/b]
			for (int i=0; i<derby.inhaltAbfrage().size(); i++) {
				LeveljComboBox.addItem(derby.inhaltAbfrage().get(i));
			}

			}
		return LeveljComboBox;	    
	}

	
	
	private JComboBox[] jComboBox = new JComboBox[10]; 
	
	public JComboBox strukturAbfrage;
	
	{
		
		for (int level=1; level<= jComboBox.length; level++){
			jComboBox[level-1] = new JComboBox(); 
			jComboBox[level-1].setBounds(new java.awt.Rectangle(15,15+level*40,600,20)); 
			jComboBox[level-1].setBackground(java.awt.SystemColor.window);
			jPanel1.add(jComboBox[level-1]);
		} 

	};
	
	
	
	/**
	 * @param args
	 */

	public static void main(String[] args) {
		FrontendGUI01 application = new FrontendGUI01();
		application.show();
		Derby derby = new Derby();
		derby.connect();
//		derby.createTables();
		derby.createNode(0, 0, 0, "Test3", "Test", "Wann ist der Fehler aufgetreten?", "When did the error happen?");
		derby.disconnect();
	}

	/**
	 * This is the default constructor
	 */
	public FrontendGUI01() {
		super();
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setForeground(java.awt.Color.black);
		this.setBackground(java.awt.Color.white);
		this.setBounds(new java.awt.Rectangle(0,0,800,600));
		this.setJMenuBar(getJJMenuBar());
		this.setContentPane(getJContentPane());
		this.setTitle("Tuchenhagen Flow Components - Know-How Datenbank");
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.setBackground(java.awt.SystemColor.window);
			jContentPane.add(getJPanel(), java.awt.BorderLayout.WEST);
			jContentPane.add(getJPanel1(), java.awt.BorderLayout.CENTER);
			jContentPane.add(getJProgressBar(), java.awt.BorderLayout.SOUTH);
		}
		return jContentPane;
	}

   /*...*/

}

Nun rufe ich da ja eine Instanz der Datenbankklasse mit
Code:
Derby derby = new Derby();
derrby.connect()
/*...*/
auf. Dabei stellt sich mir aber schon wieder die Frage: Wo denn? Also wenn ich das richtig verstanden habe, was ihr oben geschrieben habt, dann sollte ich also noch eine dritte Klasse schreiben, in der ich dann quasi diese beiden kombiniere, richtig? Dort dann auch die Main, oder? Wie mache ich denn aber dann "bekannt"? Indem ich auch wieder Instanzen erzeuge?
 
Hi,

ich abe mir das so angwöhnt, wie meine IDE (Netbeans) mir das vorgemacht hat:

- ich habe eine Klasse, die eigentlich nur eine main-Mehtode enthält. Darin wird das GUI-Objekt erzeugt.

- in der GUI-Klasse habe ich eine init-Methode, die die dort benötigten Instanzen erzeugt, so z.B. auch das DB-Objekt (wenn dies beim Start schon nötig ist.

- Über die entsprechenden Methoden der Instanzen werden dann zur Laufzeit die Aktionen ausgeführt. Bei GUIs in der Regel über das Event-Handling.

D.h. ich würde in deiner GUI eine Instanz von "Derby" privat deklarieren und in der initialize()-Methode initialisieren.

Hoffe es hilft
 
Mach dir doch jetzt einfach noch ne dritte Klasse zum "Starten". Die könnte z. B. ganz einfach so aussehen:

Code:
public class StartKlasse {

   /**
    * @param args
    */
   public static void main(String[] args) {
         new FrontendGUI01();
   }

}

Das reicht schon um deine GUI aufzurufen. Und im Konstruktor deiner GUI legst du dir dann ein Objekt von Derby an bzw. erzeugst du es im Konstruktor. Kann dann z. B. so aussehen:

Code:
private Derby xxx;

public FrontendGUI01() {
   xxx = new Derby();
   xxx.connect();
}

Und schon hast du deine GUI ganz einfach gestartet und in deiner GUI-Klasse vollen Zugriff auf Derby.

EDIT: To late, is im Prinzip nix anderes wie mein Vorposter auch schon gesagt hat. 😀
 
Vielen Dank für Eure Tipps, aber das ist gar nicht so mein Hauptproblem.

Ich komme nur mit dem static und nicht static doch arg ins Schleudern, glaube ich.
Wenn ich jetzt in meiner Klasse FrontEnd eine public void insert() schreibe, dann kann ich sie einfach aus der public static void main nicht aufrufen, weil mir dann jedesmal die Meldung: "Cannot make a static reference to the non-static method insert() from the type FrontEnd" Um die Ohren gehauen wird.

Was mache ich verkehrt?

Gruß Henning
 
Pardon, wenn ich es über die Instanz aufrufe geht es natürlich. Mal wieder mein Fehler 🙂
Sollte jetzt soweit funktionieren
 
Henning Rüther hat gesagt.:
Pardon, wenn ich es über die Instanz aufrufe geht es natürlich. Mal wieder mein Fehler 🙂
Sollte jetzt soweit funktionieren

Genau darum gehts. Du solltest in der Main nur die Anwendung starten und nix weiter dort machen. Außer du bekommst Parameter übergeben, aber das ist ein anderes Thema.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben