AnchorPane setBottomAnchor

Juelin

Bekanntes Mitglied
Hallo,
ich habe ein Programm indem ich Daten aus der Datenbank in einem Tableview anzeige.
Nun habe ich soviel Daten, das die natürlich nicht ale auf den Bildschirm passen.
Deshalb habe ich einen ScrollPane.
Die verschachtelung ist SrollPane -> AnchorPane -> TableView.
Man kann in einer ComboBox auswählen welche Person man sehen will
Wenn man eine Person in der Combobox ausgewählt hat werden die zugehörigen Daten in der Datenbank geleseen
und in das TableView gestellt..
Das ist immer die selbe Routine.
Java:
    @FXML
    void combobox21Action(ActionEvent event)
        {
        String x;
        String y;
        int a;
        int b;
        int c;
        int d;
        String z;
        x = auswahl21.getSelectionModel().getSelectedItem();
        if (freiauswahl21)
            {
            cursor_ = Cursor.cursor("WAIT");
            VitalController.scene3.setCursor(cursor_);
            letzteauswahl21 = x;
             b = 0;
             if (anzeintraegeCombobox > 0)
                 {
                 for (a=0; a< anzeintraegeCombobox; a++)
                     {
                     y = auswahl21.getItems().get(a);
                     if (y.equals(x))
                         {
                         b = 1;   
                         }
                     }
                 }
             if (b == 0)
                 {
                 auswahl21.getItems().add(x);
                 }
            setAnzeigeText3(29, "");
            freiauswahl21 = false;
            if (!letzteauswahl21.equals(""))
                {
                dLesArt = 1;
                x = "SELECT * FROM "+Vital.datenbank.dbTabelle+" ORDER BY Nachname, Vorname, Geburtsdatum, Datum, Uhrzeit";
                lesenDatenbank(x);
                if (Vital.datenbank.dbRet == 0)
                    {
                    if (anzeintraege > 0)
                        {
                        Vital.datenbank.formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy", Locale.GERMAN);
                        x = Vital.datenbank.formatter.format(anzgeburtsdatum);
                        if (!x.equals("01.01.0001"))
                            {
                            setAnzeigeText3(29, x);
                            }
                        }
                    }
                stringgridAnz = 1;
                stringgridYPos = stringgridAnz * 35;
                stringgrid.getItems().clear();
                stringgridSetYPos();
                dLesArt = 2;
                Thread lesDataToStringgrid = new Thread(new LesDataToStringgrid());
                lesDataToStringgrid.start();
                }
            Thread bspThread = new Thread(new BspThread());
            bspThread.setPriority(1);
            bspThread.start();
            }
        else
            {
            if (!x.equals(letzteauswahl21))
                {
                setAuswahlText3(21, letzteauswahl21);
                }
            }
        }

Die LeseRoutine
Java:
    @FXML
    public void lesenDatenbank(String wert)
        {
        int a;
        int l;
        String x;
        String z;
        if (dLesArt == 1)
            {
            Vital.datenbank.formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy", Locale.GERMAN);
            x = "01.01.0001";
            anzgeburtsdatum = LocalDate.parse(x, Vital.datenbank.formatter);
            }
        Vital.datenbank.dbTabelle = "vital";
        Vital.datenbank.dbBefehl = wert;
        dDaten = Vital.datenbank.getdbData();
        if (Vital.datenbank.dbRet != 0)
            {
            VitalController.f3VarRout.setAnzeigeText3(22, Vital.datenbank.FehlerAus());
            }
        else
            {
            if (anzeintraege > 0)
                {
                for (a=0; a<anzeintraege; a++)
                    {
                    Vital.datenbank.ds1 = dDaten.get(a).getVorname();
                    Vital.datenbank.ds2 = dDaten.get(a).getNachname();
                    Vital.datenbank.ds3 = dDaten.get(a).getBemerkung();
                    Vital.datenbank.dd1 = dDaten.get(a).getGeburtsdatum();
                    Vital.datenbank.dd2 = dDaten.get(a).getDatum();
                    Vital.datenbank.dt = dDaten.get(a).getUhrzeit();
                    Vital.datenbank.di1 = dDaten.get(a).getSystole();
                    Vital.datenbank.di2 = dDaten.get(a).getDiastole();
                    Vital.datenbank.di3 = dDaten.get(a).getPuls();
                    Vital.datenbank.di4 = dDaten.get(a).getSpo2();
                    Vital.datenbank.di5 = dDaten.get(a).getGroesse();
                    Vital.datenbank.df1 = dDaten.get(a).getTemperatur();
                    Vital.datenbank.df2 = dDaten.get(a).getGewicht();
                    l = Vital.datenbank.ds2.length();
                    if (l > 0)
                        {
                        Vital.datenbank.dbStringToWert();
                        if (dLesArt == 1)
                            {
                            x = Vital.datenbank.dvorname+" "+Vital.datenbank.dnachname;
                            if (x.equals(letzteauswahl21))
                                {
                                anzgeburtsdatum = Vital.datenbank.dgeburtsdatum;
                                }
                            }
                        if (dLesArt == 2)
                            {
                            x = Vital.datenbank.dvorname+" "+Vital.datenbank.dnachname;
                            if (x.equals(letzteauswahl21))
                                {
                                eintrag = new Eintrag(Vital.datenbank.ds1, Vital.datenbank.ds2, Vital.datenbank.dd1, Vital.datenbank.dd2, Vital.datenbank.dt, Vital.datenbank.di1, Vital.datenbank.di2, Vital.datenbank.di3, Vital.datenbank.di4, Vital.datenbank.df1, Vital.datenbank.di5, Vital.datenbank.df2, Vital.datenbank.ds3);
                                stringgrid.getItems().add(eintrag);
                                stringgridAnz++;
                                stringgridYPos = stringgridAnz * 35;
                                stringgridSetYPos();
                                }
                            }
                        }
                    }
                }
            }
        }

Da ja unterschiedliche Anzahl Daten zu jeder Person da sind, möchte ich natürlich auch das der Scrollbereich entsprechen angepasst wird.
Java:
    @FXML
    void stringgridSetYPos()
        {
        double w;
        w = stringgridYPos * 1.0;
        anchor.setMinHeight(w);
        anchor.setMaxHeight(w);
        anchor.setPrefHeight(w);
        stringgrid.setMinHeight(w);
        stringgrid.setMaxHeight(w);
        stringgrid.setPrefHeight(w);
        w = stringgridYPos * -1.0;
        AnchorPane.setBottomAnchor(stringgrid, w);
        }
    }

Nun zu meinem Problem:
Obwohl die Routinen immer gleich sind,
beim der ersten Auswahl Person in der ComboBox klappt alles
wenn ich dann eine andere Person auswähle wird zwar die Größe des Scrollbereiches richtig gesetzt,
aber es werden keine Daten angezeigt.
Habe schon debugged, am lesen von der Datenbank liegt es nicht, da kommen alle Daten.

Hat jemand eine Ahnung?

Danke und Gruß
Jürgen
.
 

Juelin

Bekanntes Mitglied
Hallo,
ich war natürlich nicht untätig und habe weiter getestet.
Man hatte mir ja gesagt, das ich nicht zu viel in den Anzeige UI packen sollte, da sonst die ANzeige nicht nach kommt.
So das habe ich gemacht.
In der Anzeige UI gibt es einen Befehl der die Datenbank liest und die Daten in das Tableview stellt.
lesenDatenbank(Vital.datenbank.dbBefehl);

Das auert antürlich (3000 Datensätze) einen Moment.
Das habe ich jetzt raus in einen extra Thread.
Thread lesDataToStringgrid = new Thread(new LesDataToStringgrid());
lesDataToStringgrid.start();
In dem Thread steht ja nur ein Befehl:
VitalController.f3VarRout.lesenDatenbank(Vital.datenbank.dbBefehl);

f3VarRout wird beim Start des Programmes geladen
FXMLLoader fxmlLoader = new FXMLLoader(Vital.class.getResource("VitalShow.fxml"));
scene3 = new Scene(fxmlLoader.load(), 1600, 868, Color.BLACK);
f3VarRout = fxmlLoader.getController();

Nun der Fehler, das die zweite Auswahl nichts anzeigt passiert NUR wenn ich das Programm über den Thread
laufen lasse. Wenn ich direkt im UI den Befehl ab setze läuft alles ok.

Erklär mir das mal jemand.

Danke und Gruß
Jürgen
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Nun der Fehler, das die zweite Auswahl nichts anzeigt passiert NUR wenn ich das Programm über den Thread
laufen lasse. Wenn ich direkt im UI den Befehl ab setze läuft alles ok.
Wichtig ist, das Anpassungen an der UI immer im UI Thread erfolgen müssen. Hier muss als Platform.runLater genutzt werden.

Ich hatte aber jetzt keine Zeit, mir den betreffenden Code anzusehen - das ist also nur ein Hinweis bezüglich deiner Aussage.
 

Juelin

Bekanntes Mitglied
Hallo Konrad,
Danke für Deine Antwort.
Aber wo soll den das Platform.runLater eingesetzt werden?
Der Befehl lesenDatenbank(Vital.datenbank.dbBefehl); mit Platform.runLater geht nicht.
Kommt Fehlermeldung: com/juelin/projekt10/VitalShowController.java:[206,49] "void"-Typ hier nicht zulässig
Und im Thread geht Platform.runLater erst recht nicht.
Gruß
Jürgen
 

KonradN

Super-Moderator
Mitarbeiter
Die Aufrufe, die die UI verändern sollen, die müssen im UI Thread laufen. Das ist aber explizit nicht das Lesen der Datenbank.

Du musst die Operation also aufteilen in zwei:
a) Du liest die Daten aus der Datenbank in eine Datenstruktur
b) Zu zeigst die gelesenen Daten an

Und jeder Aufruf kann über Platform.runLater erfolgen. Dies kannst Du über eine sogenannte Lambda Expression machen. Das wäre dann hier ein "() -> " gefolgt von dem Aufruf.

Nehmen wie das lesenDatenbank(Vital.datenbank.dbBefehl); als Beispiel. Das würde dann zu
Platform.runLater( () -> lesenDatenbank(Vital.datenbank.dbBefehl) );
werden. Aber noch einmal: Das wäre nicht nicht Sinn der Sache, denn das zeitaufwendige Lesen aus der Datenbank haben wir ja erst in einen separaten Thread verschoben.
 

Juelin

Bekanntes Mitglied
Hallo Konrad,
Du hast mein Kommentar nicht gelesen.
der Aufruf Platform.runLater( () -> lesenDatenbank(Vital.datenbank.dbBefehl) ); geht nicht
wegen Fehlermeldung: com/juelin/projekt10/VitalShowController.java:[206,49] "void"-Typ hier nicht zulässig
Gruß
Jürgen
 

KonradN

Super-Moderator
Mitarbeiter
Platform.runLater( () -> lesenDatenbank(Vital.datenbank.dbBefehl) );
geht

Du wirst aber das () -> nicht haben:
Platform.runLater(lesenDatenbank(Vital.datenbank.dbBefehl));
geht nicht.

Ersteres ist eine Lambda Expression und das zweite ist, dass erst lesenDatenbank aufgerufen würde und das Resultat dann an Platform.runLater gegeben würde und das geht nicht, da lesenDatenbank ein void zurück gibt aber runLater ein Runnable erwartet.
 

Ähnliche Java Themen

Neue Themen


Oben