diff --git a/core-java/src/main/java/com/baeldung/javafx/Main.java b/core-java/src/main/java/com/baeldung/javafx/Main.java new file mode 100644 index 0000000000..f68121b394 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/javafx/Main.java @@ -0,0 +1,29 @@ +package com.baeldung.javafx; + +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.layout.AnchorPane; +import javafx.stage.Stage; + +public class Main extends Application { + + public static void main(String[] args) { + launch(args); + } + + @Override + public void start(Stage primaryStage) throws Exception { + + FXMLLoader loader = new FXMLLoader(Main.class.getResource("/SearchController.fxml")); + AnchorPane page = (AnchorPane) loader.load(); + Scene scene = new Scene(page); + + scene.getStylesheets().add("/search.css"); + + primaryStage.setTitle("Title goes here"); + primaryStage.setScene(scene); + primaryStage.show(); + + } +} diff --git a/core-java/src/main/java/com/baeldung/javafx/model/Person.java b/core-java/src/main/java/com/baeldung/javafx/model/Person.java new file mode 100644 index 0000000000..dd473e84b4 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/javafx/model/Person.java @@ -0,0 +1,61 @@ +package com.baeldung.javafx.model; + +import javafx.beans.property.*; + +public class Person { + + private SimpleIntegerProperty id; + private SimpleStringProperty name; + private SimpleBooleanProperty isEmployed; + + public Person(Integer id, String name, boolean isEmployed) { + this.id = new SimpleIntegerProperty(id); + this.name = new SimpleStringProperty(name); + this.isEmployed = new SimpleBooleanProperty(isEmployed); + } + + public int getId() { + return id.get(); + } + + public IntegerProperty idProperty() { + return id; + } + + public void setId(int id) { + this.id.set(id); + } + + public String getName() { + return name.get(); + } + + public StringProperty nameProperty() { + return name; + } + + public void setName(String name) { + this.name.set(name); + } + + public boolean getIsEmployed() { + return isEmployed.get(); + } + + public BooleanProperty isEmployedProperty() { + return isEmployed; + } + + public void setIsEmployed(boolean isEmployed) { + this.isEmployed.set(isEmployed); + } + + @Override + public String toString() { + return "Person{" + + "id=" + id + + ", name='" + name + '\'' + + ", isEmployed=" + isEmployed + + '}'; + } +} diff --git a/core-java/src/main/java/com/baeldung/javafx/view/SearchController.java b/core-java/src/main/java/com/baeldung/javafx/view/SearchController.java new file mode 100644 index 0000000000..f506981714 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/javafx/view/SearchController.java @@ -0,0 +1,100 @@ +package com.baeldung.javafx.view; + + +import com.baeldung.javafx.model.Person; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.concurrent.Task; +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.control.*; +import javafx.scene.input.KeyCode; +import javafx.scene.layout.VBox; + +import java.util.List; +import java.util.stream.Collectors; + +public class SearchController { + + public static final int PAGE_ITEMS_COUNT = 10; + + @FXML + private TextField searchField; + @FXML + private Button searchButton; + @FXML + private Pagination pagination; + @FXML + private Label searchLabel; + + private ObservableList masterData = FXCollections.observableArrayList(); + + public SearchController() { + masterData.add(new Person(5, "John", true)); + masterData.add(new Person(7, "Albert", true)); + masterData.add(new Person(11, "Monica", false)); + } + + @FXML + private void initialize() { + + // search panel + searchButton.setText("Search"); + searchButton.setOnAction(event -> loadData()); + searchButton.setStyle("-fx-background-color: #457ecd; -fx-text-fill: #ffffff;"); + + searchField.setOnKeyPressed(event -> { + if (event.getCode().equals(KeyCode.ENTER)) { + loadData(); + } + }); + + searchField.textProperty().addListener((observable, oldValue, newValue) -> { + searchLabel.setText(newValue); + }); + + pagination.setPageFactory(SearchController.this::createPage); + } + + private Node createPage(Integer pageIndex) { + + VBox dataContainer = new VBox(); + + TableView tableView = new TableView<>(masterData); + TableColumn id = new TableColumn("ID"); + TableColumn name = new TableColumn("NAME"); + TableColumn employed = new TableColumn("EMPLOYED"); + + tableView.getColumns().addAll(id, name, employed); + dataContainer.getChildren().add(tableView); + + return dataContainer; + } + + private void loadData() { + + String searchText = searchField.getText(); + + Task> task = new Task>() { + @Override + protected ObservableList call() throws Exception { + updateMessage("Loading data"); + return FXCollections.observableArrayList(masterData + .stream() + .filter(value -> value.getName().toLowerCase().contains(searchText)) + .collect(Collectors.toList())); + } + }; + + task.setOnSucceeded(event -> { + masterData = task.getValue(); + pagination.setVisible(true); + pagination.setPageCount(masterData.size() / PAGE_ITEMS_COUNT); + }); + + Thread th = new Thread(task); + th.setDaemon(true); + th.start(); + } + +} diff --git a/core-java/src/main/resources/SearchController.fxml b/core-java/src/main/resources/SearchController.fxml new file mode 100644 index 0000000000..a894b0260b --- /dev/null +++ b/core-java/src/main/resources/SearchController.fxml @@ -0,0 +1,33 @@ + + + + + + + + + + + + +