Datenbank- und GUI Klasse verbinden

Shockley

Grünschnabel
Hallo,
ich habe 2 Klassen erstellt:

1.GUI
2.Datenbankabfrage

Ich möchte nun den Inhalt meiner Datenbankabfrage in TextArea's einfügen.
Dazu soll er die Textarea's aus der GUI.class nehmen.

Wie funktioniert das genau? Ich habe es hiermit probiert aber es klappt nicht:
GUI textarea = new GUI();
textarea.start();
Bin für jede Hilfe dankbar.

Code:
public class Speiseplan {
   
   
    public static void main(String[] args) {
       
        Application.launch(GUI.class);
       
}

Code:
public class GUI extends Application {

    @Override
    public void start(Stage stage) throws Exception
       
       
        final TextArea ta1 = new TextArea();
        ta1.setPrefRowCount(5);
        ta1.setPrefColumnCount(10);
        ta1.setWrapText(false);
        ta1.setPrefWidth(250);
        ta1.setPrefHeight(100);
        ta1.setLayoutX(100);
        ta1.setLayoutY(50);
   
       
        Pane pane = new Pane();
       
        Scene scene = new Scene(pane);
       
        pane.getChildren().addAll(ta1);
       
       
        stage.setWidth(1200);
        stage.setHeight(850);
        stage.setScene(scene);
        stage.setTitle("Termine");
        stage.show();
        stage.centerOnScreen();
      
    }}

Code:
public class Datenbank extends Thread {

       
        public static void db(){
           
        GUI ta = new GUI();
        ta.start();   
        LocalDate today = LocalDate.now();
            
            try{
                           
                String url ="jdbc:mysql://localhost:3306/speiseplan";
                String username ="root";
                String password = "";
           
             
              Connection myConn = DriverManager.getConnection(url, username,password);
              Statement myStmnt = myConn.createStatement();
                  
              ResultSet myRs = myStmnt.executeQuery("select * from gerichte where date= '" + today.toString() + "'");
              while (myRs.next()){
           
                   String date = myRs.getString("date");
                   String name = myRs.getString("name");
                   String type = myRs.getString("type");
               
                     ta1.appendText(date + "\n");
                 //  ta2.appendText(name + "\n");
                 //  ta3.appendText(type + "\n");
                   }}
} catch (Exception e) {
         e.printStackTrace();
             }
           }
         }
 
Hi

umgekehrt:
Die Methode mit der DB-Abfrage returned den erhaltenen String einfach, ohne irgendwas mit der GUI zu tun.
Die GUI macht sich in Start ein DB-Objekt, fragt den String ab und macht dann ta1.setText(variable);

Bei deiner jetztigen Lösung sind die Probleme vor allem,
dass das GUI-Objekt in der DB-Klasse und die angezeigte GUI zwei verschiedene Objekte sind,
und dass die DB-Klasse kaum wissen kann, wann die GUI bereit ist, den Inhalt zu bekommen.
 
Danke erstmal für die Antwort. Also ich habe die Methode db() nun in der GUI.
Aber das mit start habe ich nicht ganz verstanden...ist das soweit richtig?
Sry bin noch nicht so lange am programmieren.

Code:
public class GUI extends Application {
    @Override
    public void start(Stage stage) throws Exception
       Datenbank abfrage = new Datenbank();
       abfrage.db();
      
        final TextArea ta1 = new TextArea();
        ta1.setPrefRowCount(5);
        ta1.setPrefColumnCount(10);
        ta1.setWrapText(false);
        ta1.setPrefWidth(250);
        ta1.setPrefHeight(100);
        ta1.setLayoutX(100);
        ta1.setLayoutY(50);
  
      
        Pane pane = new Pane();
      
        Scene scene = new Scene(pane);
      
        pane.getChildren().addAll(ta1);
      
      
        stage.setWidth(1200);
        stage.setHeight(850);
        stage.setScene(scene);
        stage.setTitle("Termine");
        stage.show();
        stage.centerOnScreen();
    
    }}
 
Also, den folgenden Teil hast du aus der Datenbank-Klasse vermutlich auch rausgenommen (?):
Code:
GUI ta = new GUI();
ta.start();
Wenn nicht, dann nachholen.

Der Teil:
Code:
Datenbank abfrage = new Datenbank();
abfrage.db();
in der GUI-Klasse geht schon in die richtige Richtung, nur fehlt noch was:
Du machst jetzt eine DB-Abfrage, und mit dem Ergebnis machst du ... nichts.
Geht auch noch gar nicht.

In der db-Methode hast du sowas (Kommentare entfernt):
Code:
while (myRs.next()){
    String date = myRs.getString("date");
    String name = myRs.getString("name");
    String type = myRs.getString("type");

    ta1.appendText(date + "\n");
}
Statt hier ta1 zu ändern sammelst du die Ergebnisse in einem String und gibst sie per return zurück:
Code:
String ergebnis = "";
while (myRs.next()){
    String date = myRs.getString("date");
    String name = myRs.getString("name");
    String type = myRs.getString("type");

    ergebnis += date + "\n";
}
return ergebnis;

Wieder in der GUI-Klasse geht dann sowas:
Code:
Datenbank abfrage = new Datenbank();
String str = abfrage.db(); //Wert von return in Variable str

Und gleich danach wird ja die Textarea gemacht:
Code:
final TextArea ta1 = new TextArea();
//und ein paar Einstellungen
da kannst du jetzt mit
Code:
ta1.setText(str);
den erhaltenen Text reinbringen.
 
Zuletzt bearbeitet:
Danke für deinen Vorschlag.
Zu 1.: Habe ich entfernt.

Leider meckert er bereits beim return.
return ergebnis; ---> "ergebnis cannot be resolved to a variable"

Ein ähnliches problem hatte ich schonmal. Als noch GUI und DB in einer Klasse waren, konnte ich die String Variablen der jeweiligen while-Blöcke nicht außerhalb benutzen. Er hat die Variablen nicht erkannt. Deshalb waren ta1, ta2 und ta3 innerhalb des while-Blocks.
 
Code:
ResultSet myRs = myStmnt.executeQuery("select * from gerichte where date= '" + today.toString() + "'");
        String ergebnis ="";
        while (myRs.next()){
                    
          String subject = myRs.getString("date");
          String date_start = myRs.getString("name");
          String due_date = myRs.getString("type");
    
          
          ergebnis += date_start + "\n";
        
        }
        return ergebnis;

OK habs nun aber trozdem meckert er erneut beim return: "Void methods cannot return a value"
 
Ändere
public static void db()
zu
public static String db()

(Dachte eigentlich, das ist klar, wenn man schon DB-Abfragen macht :)
Vielleicht etwas langsamer angehen und dafür gründlicher lernen...)
 
Zurück