Tabelle befüllen JavaFX

jimb0p

Erfahrenes Mitglied
Hi Zusammen,

arbeite mich aktuell in JavaFX ein. Habe mir mit dem Scenebuilder ne GUI gebaut. Der Teil mit der Tabelle sieht wie folgt aus:

Code:
<TableView fx:id="mainTableView" prefHeight="574.0" prefWidth="1276.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
  <columns>
     <TableColumn fx:id="clmnBrand" prefWidth="117.0" text="Marke" />
     <TableColumn fx:id="clmnHan" prefWidth="120.0" text="HAN" />
     <TableColumn fx:id="clmnName" prefWidth="330.0" text="Name" />
     <TableColumn fx:id="clmnFarbe" prefWidth="208.0" text="Farbe" />
     <TableColumn fx:id="clmnOrt" prefWidth="85.0" text="Ort" />
     <TableColumn fx:id="clmnPreis" prefWidth="86.0" text="Preis(VK)" />
     <TableColumn fx:id="clmnLager" editable="false" minWidth="1.0" prefWidth="77.0" text="Lager" />
     <TableColumn fx:id="clmnZulauf" editable="false" prefWidth="63.0" text="Zulauf" />
     <TableColumn fx:id="clmnStatus" prefWidth="69.0" text="Status" />
     <TableColumn fx:id="clmnNewsletter" editable="false" prefWidth="24.0" resizable="false" text="NL" />
     <TableColumn fx:id="clmnBlog" editable="false" prefWidth="25.0" resizable="false" text="BG" />
     <TableColumn fx:id="clmnSocielMedia" editable="false" prefWidth="25.0" resizable="false" text="SM" />
     <TableColumn fx:id="clmnNewsblog" editable="false" prefWidth="25.0" resizable="false" text="NB" />
  </columns>
</TableView>

Nun habe ich eine Klasse Artikel welche so aussieht:
Java:
    private int kArtikel;
    private String marke;
    private String cHan;
    private String name;
    private String farbe;
    private String lagerOrt;
    private float preis;
    private int mengeLager;
    private int mengeZulauf;
    private String status;
    private boolean newsletterSent;
    private boolean blogSent;
    private boolean socialMediaSent;
    private boolean newsBlogSent;

entsprechend noch die getter und setter Methoden. Jetzt hole ich mir 100 Artikel aus der Datenbank und fülle folgende Liste damit:

Java:
private ObservableList<Artikel> articleList = FXCollections.observableArrayList();

Soweit so gut. Jetzt möchte ich den Inhalt in meine Tabelle in der GUI bekommen, allerdings weiß ich hier nicht weiter. Wenn noch Codeschnipsel fehlen sagt Bescheid. Gruß!
 

jimb0p

Erfahrenes Mitglied
Hallo,

ich habe es soweit geschafft die Tabelle beim Laden mit Dummydaten zu füllen. Jetzt möchte ich diese mit Daten aus der Datenbank befüllen, jedoch habe ich vorab noch eine Frage: Ich möchte so wie in dem Tutorial was du gepostet hast mich an das MVC Muster halten, jedoch habe ich irgendwie noch einen Denkfehler drin, weil es werden ja die fxml geladen und irgendwie weiß ich jetzt nicht wo ich die Funktion reinpacke die das Datenbankobjekt benutzt um an die Daten aus der DB zu bekommen. Ich habe einmal eine Klasse Artikel, die alle Elemente für eine Zeile in der Tabelle enthält. Dann die Klasse MainApp die meine fxml lädt und den Controller dazu. Packe ich den Aufruf in die MainApp? Hier wird direkt in der main launch(args); aufgerufen, dann müsste ich es doch theoretisch davor machen oder?

Edit1:
Oder kommt es in die start Funktion?

Vielen Dank für jede Hilfe, ich hoffe es ist verständlich erklärt.
 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
Ich verstehe deine Frage nicht ganz.

Deine DB-Abfrage sollte eine Liste mit Artikeln generieren, welche dann in der JavaFX-App angezeigt werden.
Du kannst die Liste des Weiteren immer ändern, sodass das Laden nicht unbedingt in launch(args) erfolgen muss. Dies würde ich sowieso nicht empfehlen, da launch zur ganzen Applikation selbst gehört und nicht zu deinem spezifischen Controller.
 

jimb0p

Erfahrenes Mitglied
Ich habe es jetzt wie folgt gelöst:

Java:
public class MainApp extends Application{

    private Stage primaryStage;
    private BorderPane rootLayout;
   
    private static Config config = new Config();
    private static Database db = new Database();
    private Controller controller;
    private static String CONFIGFILE = "config.txt";
   
    private static DataBean dataBean;
   
    public MainApp(){
       
    }
   
    public static void main(String[] args){
        try {
            //Config File einlesen aus dem Rootverzeichnis
            readInConfig();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            //Mit Datenbank verbinden und den AutoCommit auf false setzen
            db.connect(config.getDbHost(), config.getDbMandant(), config.getDbUser(), config.getDbPw());
            db.setAutoCommit();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        launch(args);
    }
   
    @Override
    public void start(Stage primaryStage) throws Exception {
        //Holt alle Artikel für die Übersicht
        dataBean = new DataBean(primaryStage);
        db.getFirstBoundOfData(dataBean.getArticleData());
       
        //Setzt die Primary Stage und den Namen
        this.primaryStage = primaryStage;
        this.primaryStage.setTitle("Anwendungsname");
       
        initRootLayout();
        showProductOverview();
    }
   
    //Gibt die main Stage zurück
    public Stage getPrimaryStage(){
        return(primaryStage);
    }
   
    //GUI Elmemente initialisieren
    //Initilisiert das RootLayout
    public void initRootLayout() {
        try {
            // Load root layout from fxml file.
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(MainApp.class.getResource("../view/RootLayout.fxml"));
            rootLayout = (BorderPane) loader.load();

            // Show the scene containing the root layout.
            Scene scene = new Scene(rootLayout);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   
    public void showProductOverview() {
        try {
            // Load person overview.
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(MainApp.class.getResource("../view/MainView.fxml"));
            AnchorPane productOverview = (AnchorPane) loader.load();

            // Set person overview into the center of root layout.
            rootLayout.setCenter(productOverview);
           
            //Controller bekommt Zugriff auf die MainApp
            controller = loader.getController();
            controller.setMainApp(this, dataBean);
           
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Das funktioniert soweit auch, ist es so gut gelöst oder ist hier Optimierungsbedarf?