Mehtode bei Start des Programms ausführen (Klassen übergreifend)

Zakon

Bekanntes Mitglied
Hallo zusammen,

ich möchte eine Methode die ich in einer Klasse geschirben habe bei Start des Programms ausführen lasssen.
Java:
@FXML
    public void befuellen() {
        boxFirma.setItems((ObservableList<FirmenDetails>)data1);
        boxProdukt.setItems((ObservableList<ProduktDetails>) data2);
        boxName.setItems((ObservableList<allDetails>) dataall);
    }

    @FXML
    public void loadDataFromDatabase() {
        loadFirmaButton.setOnAction(event -> dropdownFirmen());
        loadProduktButton.setOnAction(event -> dropdownProdukt());
        updateButton.setOnAction(event -> bearbeitung());

        try {
            if(loadFirmaButton.isPressed()){
                dataall = FXCollections.observableArrayList();
                dropdownFirmen();
                loadalldetails();
            }
            else if (loadProduktButton.isPressed()){
                dataall = FXCollections.observableArrayList();
                dropdownProdukt();
                loadalldetails();
            }
            else if(updateButton.isPressed()){
                dataall = FXCollections.observableArrayList();
                bearbeitung();
                loadalldetails();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Java:
public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("view.fxml"));
        primaryStage.setTitle("Datenbank Firmen");
        primaryStage.setScene(new Scene(root, 800, 600));
        primaryStage.show();

    }


    @Override
    public void stop() throws Exception {
        DBConnection.getInstance().getCon().close();
        super.stop();
    }

    @Override
    public void init() throws Exception {
        DBConnection.getInstance().connect();
        super.init();
    }

    public static void main(String[] args) throws NoSuchMethodException {
        launch(args);
    }

}


Ich bin mir nicht sicher wie ich das ganze anstelle.
Danbke im vorraus für eure Hilfe 😁
 
Naja, beim Start des Programms halt die Methode aufrufen – nicht anders als bei den anderen Methoden, die du aufrufst. Hast du irgendein konkretes Problem?
 
Was genau probierst Du denn? Die Ausschnitte, die Du gebracht hast, geben diesbezüglich bisher keine wirklichen Informationen preis.
 
Ich habe drei Klassen einmal DBConnection(SQL / alles von der Datenbank), Controller(logic klasse zum nehmen der Informationen) und view (alles für JavaFx / Oberfläche) (und natürlich noch die Main klasse). jetzt habe ich das problem das das befüllen von zb der Boxen direkt am anfang passieren muss also in meiner Main Klasse. Ich bekomme diese methode die befuellen beei mir heißt aber nicht vorgeschlagen bzw kann sie auch manuel nicht in die main reinschreiben 🤔 Würde den Code posten nur ist es ziemlich viel..
 
Also im Controller sowas wie:
Java:
    @FXML
    public void initialize() {
        // Hier befüllen aufrufen?
    }

Ansonsten gehört dies nicht in die main, denn Du hast da in der Regel keinen Controller. Du kannst Ihn Dir natürlich noch geben lassen über den FXMLLoader, aber da gehört das, was Du vor hast, ja einfach nicht hin ...
 
die Methoden die ich aufrufen möchte sind aber nicht im COntroller sondern in meiner View class. Kommt es dann auf das gleiche hinaus? 🤔
 
Dann zeig den ganzen Aufbau und nicht nur die Ausschnitte. Was ist in der view.fxml als Controller angegeben?
Was ist das für eine Klasse, in der Du lauter @FXML Attribute verwendest und was sollen diese an welcher Stelle bewirken?
 
Das ist meine View class:
Java:
 @FXML
    public void initialize(){
        befuellen();
        startTabelle();
    }

    @FXML
    public  void befuellen() {
        boxFirma.setItems((ObservableList<FirmenDetails>)data1);
        boxProdukt.setItems((ObservableList<ProduktDetails>) data2);
        boxName.setItems((ObservableList<allDetails>) dataall);
    }
    @FXML
    public void startTabelle(){
        loadDataStart();
        loadalldetails();
    }


    @FXML
    private void loadalldetails(){
        columnID2.setCellValueFactory(new PropertyValueFactory<>("ID2"));
        columnFirmenName2.setCellValueFactory(new PropertyValueFactory<>("FirmenName2"));

        columnMitarbeiter_ID2.setCellValueFactory(new PropertyValueFactory<>("Mitarbeiter_ID2"));
        columnVorname2.setCellValueFactory(new PropertyValueFactory<>("Vorname2"));
        columnNachname2.setCellValueFactory(new PropertyValueFactory<>("Nachname2"));
        columnFirmen_ID2.setCellValueFactory(new PropertyValueFactory<>("Firmen_ID2"));

        columnProdukt_ID2.setCellValueFactory(new PropertyValueFactory<>("Produkt_ID2"));
        columnProdukt2.setCellValueFactory(new PropertyValueFactory<>("Produkt2"));

        tableall.setItems(null);
        tableall.setItems((ObservableList<allDetails>) dataall);
    }
}
Controller class:
Java:
public class Controller {

    //ObservableLists
    public List<UserDetails> data;
    public List<FirmenDetails> data1;
    public List<ProduktDetails> data2;
    public List<allDetails> dataall;

    //Verschönerung des Codes
    //Controller Klasse nur Aufruf der Daten über Methode in Model


    public void loadDataStart(){
        dataall = FXCollections.observableArrayList();
        DBConnection.getInstance().loadData();
    }
    //DropDown Firmen
    public void dropdownFirmen(){
        dataall = FXCollections.observableArrayList();
        DBConnection.getInstance().loadFirmenDetails();
    }

    //DropDown Produkt
    public void dropdownProdukt(){
        dataall = FXCollections.observableArrayList();
        DBConnection.getInstance().loadProduktDetails();
    }
    public void bearbeitung(){
        dataall = FXCollections.observableArrayList();
        DBConnection.getInstance().bearbeitungDetails();
    }
}
fxml:
Java:
 <Tab text="SELECT X/Y">
                  <content>
                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="303.0" prefWidth="818.0">
                           <children>
                              <TableView fx:id="tableall" layoutX="166.0" layoutY="8.0" prefHeight="533.0" prefWidth="740.0">
                                <columns>
                                  <TableColumn fx:id="columnID2" prefWidth="49.59991455078125" text="ID" />
                                  <TableColumn fx:id="columnFirmenName2" prefWidth="120.39994812011719" text="FirmeName" />
                                    <TableColumn fx:id="columnMitarbeiter_ID2" prefWidth="90.39996337890625" text="Mitarbeiter_ID" />
                                    <TableColumn fx:id="columnVorname2" prefWidth="101.5999755859375" text="Vorname" />
                                    <TableColumn fx:id="columnNachname2" prefWidth="108.39996337890625" text="Nachname" />
                                    <TableColumn fx:id="columnProdukt_ID2" prefWidth="69.59991455078125" text="Produkt_ID" />
                                    <TableColumn fx:id="columnProdukt2" prefWidth="59.9998779296875" text="Produkt" />
                                    <TableColumn fx:id="columnFirmen_ID2" prefWidth="69.5999755859375" text="Fimren_ID" />
                                </columns>
                              </TableView>
                              <Button fx:id="laden" layoutX="17.0" layoutY="48.0" mnemonicParsing="false" onAction="#dropdownFirmen" text="Laden" />
                              <ComboBox fx:id="boxFirma" layoutX="14.0" layoutY="85.0" prefWidth="150.0" />
                              <Button fx:id="laden2" layoutX="15.0" layoutY="188.0" mnemonicParsing="false" onAction="#dropdownProdukt" text="Laden" />
                              <ComboBox fx:id="boxProdukt" layoutX="14.0" layoutY="226.0" prefWidth="150.0" />
                           </children>
                        </AnchorPane>
                  </content>
                </Tab>
                  <Tab text="Bearbeitungen">
                    <content>
                      <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="571.0" prefWidth="995.0">
                           <children>
                              <TableView fx:id="tableall1" layoutX="203.0" layoutY="14.0" prefHeight="533.0" prefWidth="677.0">
                                 <columns>
                                    <TableColumn fx:id="columnID21" prefWidth="49.59991455078125" text="ID" />
                                    <TableColumn fx:id="columnFirmenName21" prefWidth="120.39994812011719" text="FirmeName" />
                                    <TableColumn fx:id="columnMitarbeiter_ID21" prefWidth="90.39996337890625" text="Mitarbeiter_ID" />
                                    <TableColumn fx:id="columnVorname21" prefWidth="101.5999755859375" text="Vorname" />
                                    <TableColumn fx:id="columnNachname21" prefWidth="108.39996337890625" text="Nachname" />
                                    <TableColumn fx:id="columnProdukt_ID21" prefWidth="69.59991455078125" text="Produkt_ID" />
                                    <TableColumn fx:id="columnProdukt21" prefWidth="59.9998779296875" text="Produkt" />
                                    <TableColumn fx:id="columnFirmen_ID21" prefWidth="69.5999755859375" text="Fimren_ID" />
                                 </columns>
                              </TableView>
                              <Text layoutX="14.0" layoutY="109.0" strokeType="OUTSIDE" strokeWidth="0.0" text="UPDATE" wrappingWidth="96.13671875" />
                              <Text layoutX="14.0" layoutY="184.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Zu Produkt:" wrappingWidth="96.13671875" />
                              <TextField fx:id="wert1" layoutX="14.0" layoutY="194.0" />
                              <Button fx:id="update" layoutX="14.0" layoutY="240.0" mnemonicParsing="false" onAction="#bearbeitung" text="UPDATE" />
                              <ComboBox fx:id="boxName" layoutX="14.0" layoutY="113.0" prefWidth="150.0" />
                           </children></AnchorPane>

Ich möchte halt aus der View class die Methode befullen und starttabelle bei programmstart direkt ausführen lassen.

Habe jetzt nur das nötigste aus den codes eingefügt hoffe das reicht so.

Und hier noch wo in der fxml die Controller class bestimmt ist :
Java:
<GridPane alignment="center" hgap="10" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="652.0" prefWidth="1000.0" vgap="10" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Main.logic.Controller">
 
Das ist nur ein Auszug aus der fxml Datei und da steckt nicht drin, was wichtig ist. Das wäre halt ob und wo in dem fxml ein fx:controller Attribut gesetzt wurde.

Ich vermute, dass dies vorhanden ist und dass dies auf Deine "View" Klasse verweist. (Was die Klasse streng genommen zu dem Controller macht. Da vorhandene Begriffe anders zu verwenden, lehne ich strikt ab und würde ich Dir auch von abraten. Den Controller "View" zu nennen, wäre ok. Aber dann gibt es keinen Controller mehr! Das wäre z.B. in einem MVVM Model denkbar (z.B. mit mvvmFX):
View: Dies umfasst dann das fxml File sowie die "Controller" Klasse, die dann auch vom Namen her View heissen sollte,
Model: Das sind dann die üblichen Klassen die halt sozusagen die Business Logik enthalten.
ViewModel: Das wäre dann, was du etwas als Controller bezeichnest: Ein speziell für die View aufgebautes Model, welches die Daten in einer Form vorhält, die die View benötigt (also speziell das Observer Pattern ermöglichen - darum geht es in erster Linie aus meiner Sicht)

Aber unabhängig davon, wie Du die Klasse benennen willst: Die Klasse, von der der FXMLLoader eine Instanz erstellt (als Controller) und dabei dann u.a. nach @FXML Annotations schaut, ist die Klasse, in der du auch das gezeigte initialize machen kannst. Und das scheint auch die Klasse zu sein, die die gewünschte Methode enthält, die du aufrufen möchtest ...

Und das ist auch die Methode, die generell verwendet werden soll, irgendwas mit den Controls zu machen, die Du vom FXMLLoader injecten lassen hast (und die daher im Konstruktor noch null sind)....
 
Ok perfekt danke ich verstehe 😁
Der Sinn hinter dieser aufteilung ist halt das ich keine zwei sprachen in einer klasse habe und somit immer sprachen, klassen unabhängig alles ändern kann.
 
Also nur, dass es deutlich wird: Die Aufteilung selbst ist vollkommen in Ordnung! Die Benennung finde ich nur verwirrend - speziell, dass etwas als Controller benannt wird, aber dann bei Controller im fxml wohl nicht eingetragen ist.

Generell halte ich die Aufteilung sogar für sehr gut - nur eben mit den Begrifflichkeiten bei MVVM - evtl. willst Du dir bei Gelegenheit ja mal auf github das mvvmFX ansehen. Aber das ist nicht zwingend notwendig, aber ggf. bietet es noch Dinge, die Dir das Leben auch etwas einfacher machen....
 
Ok ich bedanke mich werde ich mir mal bei gelegenheit angucken. Und ich achte natürlich das nächste mal auf die bennenung 😁
 

Zurück
Oben