首页 > 解决方案 > Javafx:单击按钮打开第二个选择窗口

问题描述

我正在制作一个按钮,它会打开一个包含成员网格视图的新窗口,其中显示了他们的姓名和排名。可以单击成员将其设置为 currentMember。但是我的 JavaFX 知识是有限的,我不知道如何在不更改当前控制器的情况下创建这个临时窗口。我不确定我所拥有的是否是一种好的方法。我做错了什么还是这是正确的做法?

单击“选择人员”按钮时运行此代码

@FXML
    private void setLid(ActionEvent event) {
        Stage stage = new Stage();
        VBox box = new VBox();
        box.setPadding(new Insets(10));

        TableView<Persoon> tablePers = new TableView<>();
        TableColumn<Persoon, String> voornaam = new TableColumn<>();
        TableColumn<Persoon, String> achternaam = new TableColumn<>();
        TableColumn<Persoon, String> graad = new TableColumn<>();

        voornaam.setCellValueFactory(cellData -> cellData.getValue().voornaamProperty());
        voornaam.setCellFactory(TextFieldTableCell.forTableColumn());
        achternaam.setCellValueFactory(cellData -> cellData.getValue().achternaamProperty());
        graad.setCellValueFactory(cellData -> cellData.getValue().graadProperty());

        Label label = new Label("Selecteer een persoon");

        Button btnSelectCurrentLid = new Button();
        btnSelectCurrentLid.setText("Bevestigen");

        btnSelectCurrentLid.setOnAction((ActionEvent e) -> {
            geselecteerdePersoon = (tablePers.getSelectionModel().getSelectedItem());
            stage.close();
        });

        box.getChildren().add(label);
        box.getChildren().add(tablePers);
        box.getChildren().add(btnSelectCurrentLid);

        Scene scene = new Scene(box, 250, 150);
        stage.setScene(scene);
        stage.show();
    }

标签: buttonjavafxwindow

解决方案


这是一个单文件mcve (将整个代码复制粘贴到FxMain.java并运行):

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class FxMain extends Application {

    private Persoon geselecteerdePersoon;

    @Override
    public void start(Stage primaryStage) throws Exception{

        Label selectedPersonInfo = new Label();
        Button start = new Button("Show Tabel");
        start.setOnAction(e-> {
            new LoginDialog().showAndWait();
            selectedPersonInfo.setText("Selected: " +geselecteerdePersoon.voornaamProperty().get()
                                          + " " +geselecteerdePersoon.achternaamProperty().get());
        });

        BorderPane root = new BorderPane(selectedPersonInfo);
        root.setBottom(start);
        primaryStage.setScene(new Scene(root, 300,300));
        primaryStage.show();
    }

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

    class LoginDialog extends Dialog {

        public LoginDialog() {

            VBox box = new VBox();
            box.setPadding(new Insets(10));

            TableView<Persoon> tablePers = new TableView<>();
            TableColumn<Persoon, String> voornaam = new TableColumn<>("Name");
            TableColumn<Persoon, String> achternaam = new TableColumn<>("Last Name");
            TableColumn<Persoon, String> graad = new TableColumn<>("Grade");

            voornaam.setCellValueFactory(cellData -> cellData.getValue().voornaamProperty());
            voornaam.setCellFactory(TextFieldTableCell.forTableColumn());
            achternaam.setCellValueFactory(cellData -> cellData.getValue().achternaamProperty());
            graad.setCellValueFactory(cellData -> cellData.getValue().graadProperty());

            tablePers.getColumns().addAll(voornaam, achternaam, graad);
            tablePers.getItems().add(new Persoon("Alice", "Bee","70"));
            tablePers.getItems().add(new Persoon("Charly", "Din","32"));

            Label label = new Label("Selecteer een persoon");

            Button btnSelectCurrentLid = new Button();
            btnSelectCurrentLid.setText("Bevestigen");

            btnSelectCurrentLid.setOnAction((ActionEvent e) -> {
                 geselecteerdePersoon = tablePers.getSelectionModel().getSelectedItem();
                 close();
            });

            box.getChildren().addAll(label, tablePers, btnSelectCurrentLid);
            getDialogPane().setContent(box);
            getDialogPane().getButtonTypes().addAll(ButtonType.CANCEL);
        }
    }
}

class Persoon {

    private final SimpleStringProperty lName;
    private final SimpleStringProperty fName;
    private final SimpleStringProperty grade;

    public Persoon(String fName, String lName, String grade) {

        this.fName = new SimpleStringProperty(fName);
        this.lName = new SimpleStringProperty(lName);
        this.grade = new SimpleStringProperty(grade);
    }

    public final StringProperty achternaamProperty() {  return lName;   }

    public final StringProperty voornaamProperty() { return fName; }

    public final StringProperty graadProperty() { return grade;  }
}

推荐阅读