控制器中的 FileChooser class - SceneBuilder JavaFX
FileChooser in Controller class - SceneBuilder JavaFX
我正在尝试编写使用 SceneBuilder 创建的按钮的功能。
我在 Scene builder 中找到了 "Code" 部分,并设置了单击按钮时将启动的方法的名称(例如 fileSelector)。在方法中我应该使用 FileChooser 变量(我需要从 PC 中获取图像并将其保存到 "File" 变量)。
我复制了示例控制器框架并将其粘贴到我的控制器 class。现在我不知道如何实现该方法,因为我需要一个 Stage 变量来与 FileChooser 变量一起使用,但是阶段变量是为 public void start(Stage primaryStage)
方法提供的。
我的主要Class
package application;
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
public class MainExample extends Application {
@Override
public void start(Stage primaryStage) throws IOException {
Pane firstPane = FXMLLoader.load(MainExample.class.getClassLoader().getResource("buttonExample.fxml"));
Scene firstScene = new Scene(firstPane);
primaryStage.setScene(firstScene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
我的控制器Class
package application;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
public class MyController {
@FXML
private Button selectFile;
@FXML
void fileSelector(ActionEvent event) {
FileChooser fileChooser = new FileChooser();
File file = fileChooser.showOpenDialog(stage);
}
}
来自按钮的 FXML
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.Pane?>
<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="135.0" prefWidth="280.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MyController">
<children>
<Button fx:id="selectFile" layoutX="102.0" layoutY="55.0" mnemonicParsing="false" onAction="#fileSelector" text="SelectFile" />
</children>
</Pane>
您需要一个 Window
实例来显示 FileChooser
对话框,您可以从这样的事件中获取它:
@FXML
void fileSelector(ActionEvent event) {
Window window = ((Node) (event.getSource())).getScene().getWindow();
FileChooser fileChooser = new FileChooser();
File file = fileChooser.showOpenDialog(window);
event.consume();
}
我正在尝试编写使用 SceneBuilder 创建的按钮的功能。 我在 Scene builder 中找到了 "Code" 部分,并设置了单击按钮时将启动的方法的名称(例如 fileSelector)。在方法中我应该使用 FileChooser 变量(我需要从 PC 中获取图像并将其保存到 "File" 变量)。
我复制了示例控制器框架并将其粘贴到我的控制器 class。现在我不知道如何实现该方法,因为我需要一个 Stage 变量来与 FileChooser 变量一起使用,但是阶段变量是为 public void start(Stage primaryStage)
方法提供的。
我的主要Class
package application;
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
public class MainExample extends Application {
@Override
public void start(Stage primaryStage) throws IOException {
Pane firstPane = FXMLLoader.load(MainExample.class.getClassLoader().getResource("buttonExample.fxml"));
Scene firstScene = new Scene(firstPane);
primaryStage.setScene(firstScene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
我的控制器Class
package application;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
public class MyController {
@FXML
private Button selectFile;
@FXML
void fileSelector(ActionEvent event) {
FileChooser fileChooser = new FileChooser();
File file = fileChooser.showOpenDialog(stage);
}
}
来自按钮的 FXML
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.Pane?>
<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="135.0" prefWidth="280.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MyController">
<children>
<Button fx:id="selectFile" layoutX="102.0" layoutY="55.0" mnemonicParsing="false" onAction="#fileSelector" text="SelectFile" />
</children>
</Pane>
您需要一个 Window
实例来显示 FileChooser
对话框,您可以从这样的事件中获取它:
@FXML
void fileSelector(ActionEvent event) {
Window window = ((Node) (event.getSource())).getScene().getWindow();
FileChooser fileChooser = new FileChooser();
File file = fileChooser.showOpenDialog(window);
event.consume();
}