【问题标题】:FileChooser in Controller class - SceneBuilder JavaFXController 类中的 FileChooser - SceneBuilder JavaFX
【发布时间】:2020-07-01 14:34:53
【问题描述】:

我正在尝试编写使用 SceneBuilder 创建的按钮的功能。 我在场景构建器中找到了“代码”部分,并设置了单击按钮时将启动的方法的名称(例如 fileSelector)。在方法中我应该使用 FileChooser 变量(我需要从 PC 中获取图像并将其保存到“文件”变量中)。

我复制了示例控制器骨架并将其粘贴到我的 Controller 类中。现在我不知道如何实现该方法,因为我需要一个 Stage 变量来与 FileChooser 变量一起使用,但是为 public void start(Stage primaryStage) 方法提供了 stage 变量。

我的主要课程

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);
    }
}

我的控制器类

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>

【问题讨论】:

    标签: java javafx scenebuilder filechooser


    【解决方案1】:

    你需要一个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();
    }
    

    【讨论】:

    • 注意,既然已经有了事件源的引用,可以简化为selectFile.getScene().getWindow();
    • 注意:如果事件的来源是MenuItem,则会抛出ClassCastException
    猜你喜欢
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 2019-02-27
    • 2015-05-09
    • 2018-05-12
    • 2016-05-30
    • 1970-01-01
    • 2015-08-21
    相关资源
    最近更新 更多