button - 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();
}
解决方案
这是一个单文件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; }
}
推荐阅读
- php - 来自 Twilio 的拨出电话在 Laravel 5.5 中不起作用
- gnuplot - 在多图中设置唯一图例
- android - SpeechRecognizer 提供多种语言的结果,但我只想要一种语言
- c# - 检查 IEnumerable
填满了不计入的可选词 - php - 自定义产品导出 PHP 脚本不起作用
- dart - 列出更改的侦听器
- c++ - 这是在 C++03 中执行“表达式 SFINAE”的有效方法吗?
- python - 安装和卸载 Python2 后出错
- python - Selenium 从帖子中获取评论
- mysql - Mysql:某些服务如果没有被其他服务或程序使用,会自动停止