Hallo zusammen,
ich versuche eine Anwendung zu schreiben, die (hier als Beispiel) Filme verwalten soll. Hier mein Code:
[CODE lang="java" title="Main.java"]import java.util.ArrayList;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
ScrollPane root;
private ArrayList<Movie> movies;
Scene scene;
@SuppressWarnings("exports")
@Override
public void start(Stage stage) {
try {
this.root = new ScrollPane();
VBox vbox = new VBox();
// Beispielfilme holen
this.movies = getMovies();
// Filme zur VBox hinzufügen
for (Movie m : this.movies) {
createMovie(vbox, m);
}
// VBox am root platzieren
root.setContent(vbox);
scene = new Scene(root, 310, 300);
stage.setScene(scene);
stage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
private ArrayList<Movie> getMovies() {
// Neue Liste mit zwei Beispielfilmen erstellen
ArrayList<Movie> list = new ArrayList<>();
list.add(new Movie("Hannibal"));
list.add(new Movie("Shining"));
return list;
}
private void createMovie(VBox vbox, Movie m) {
// Fügt Filme hinzu
GridPane moviePane = new GridPane();
// Titel des Films
Label title = new Label("Title: ");
moviePane.add(title, 0, 1);
moviePane.add(new Label(m.getTitle()), 1, 1);
// Button zum Löschen des Films
Button deleteButton = new Button("Delete Movie");
deleteButton.setOnAction(e -> {
// Film aus der Filmliste löschen
this.movies.remove(m);
});
moviePane.add(deleteButton, 1, 2);
vbox.getChildren().add(moviePane);
}
public static void main(String[] args) {
launch(args);
}
}[/CODE]
main() startet die JavaFX-Anwendung und die von javafx.application.Application geerbte Methode start() wird aufgerufen. Hier werden zwei Beispielfilme erstellt und - mit Hilfe von createMovie() - auf der Benutzeroberfläche platziert. Ein Film besteht aus einem Titel und einem dazugehörigen Button zum Löschen des Films aus der Filmliste vom Typ ArrayList<Movie>.
Das Betätigen des Lösch-Buttons (deleteButton) ruft die setOnAction()-Methode des Buttons auf und löscht den Film aus der Filmliste.
Das funktioniert soweit auch sehr gut. Mein Problem ist allerdings, dass die Änderungen an der Filmliste (ArrayList<Movie> movies) - also konkret das Löschen - sich nicht auf die GUI auswirken. Ich hätte erwartet, dass der gelöschte Film sofort von der GUI verschwindet.
Ich habe bereits recherchiert, ob es eine Art update()- bzw. refresh()-Methode gibt, die nach dem Löschen gesondert aufgerufen werden muss aber so wie ich es verstanden habe, sollte dies automatisch funktionieren.
Ich würde mich sehr freuen, wenn mir jemand bei meinem Problem helfen könnte.
ich versuche eine Anwendung zu schreiben, die (hier als Beispiel) Filme verwalten soll. Hier mein Code:
[CODE lang="java" title="Main.java"]import java.util.ArrayList;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
ScrollPane root;
private ArrayList<Movie> movies;
Scene scene;
@SuppressWarnings("exports")
@Override
public void start(Stage stage) {
try {
this.root = new ScrollPane();
VBox vbox = new VBox();
// Beispielfilme holen
this.movies = getMovies();
// Filme zur VBox hinzufügen
for (Movie m : this.movies) {
createMovie(vbox, m);
}
// VBox am root platzieren
root.setContent(vbox);
scene = new Scene(root, 310, 300);
stage.setScene(scene);
stage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
private ArrayList<Movie> getMovies() {
// Neue Liste mit zwei Beispielfilmen erstellen
ArrayList<Movie> list = new ArrayList<>();
list.add(new Movie("Hannibal"));
list.add(new Movie("Shining"));
return list;
}
private void createMovie(VBox vbox, Movie m) {
// Fügt Filme hinzu
GridPane moviePane = new GridPane();
// Titel des Films
Label title = new Label("Title: ");
moviePane.add(title, 0, 1);
moviePane.add(new Label(m.getTitle()), 1, 1);
// Button zum Löschen des Films
Button deleteButton = new Button("Delete Movie");
deleteButton.setOnAction(e -> {
// Film aus der Filmliste löschen
this.movies.remove(m);
});
moviePane.add(deleteButton, 1, 2);
vbox.getChildren().add(moviePane);
}
public static void main(String[] args) {
launch(args);
}
}[/CODE]
main() startet die JavaFX-Anwendung und die von javafx.application.Application geerbte Methode start() wird aufgerufen. Hier werden zwei Beispielfilme erstellt und - mit Hilfe von createMovie() - auf der Benutzeroberfläche platziert. Ein Film besteht aus einem Titel und einem dazugehörigen Button zum Löschen des Films aus der Filmliste vom Typ ArrayList<Movie>.
Das Betätigen des Lösch-Buttons (deleteButton) ruft die setOnAction()-Methode des Buttons auf und löscht den Film aus der Filmliste.
Das funktioniert soweit auch sehr gut. Mein Problem ist allerdings, dass die Änderungen an der Filmliste (ArrayList<Movie> movies) - also konkret das Löschen - sich nicht auf die GUI auswirken. Ich hätte erwartet, dass der gelöschte Film sofort von der GUI verschwindet.
Ich habe bereits recherchiert, ob es eine Art update()- bzw. refresh()-Methode gibt, die nach dem Löschen gesondert aufgerufen werden muss aber so wie ich es verstanden habe, sollte dies automatisch funktionieren.
Ich würde mich sehr freuen, wenn mir jemand bei meinem Problem helfen könnte.