Не удается заставить fileChooser работать на сцене, не знаете, как установить правильную сцену? - PullRequest
0 голосов
/ 20 июня 2020

Я новичок в JavaFx и использую filechooser на текущем этапе для получения имени файла и пути к файлу.

Я создал тестовый код, чтобы показать мою проблему ...

test_main. java

package view;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;


public class test_main extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("/view/Sample.fxml"));

        Scene scene = new Scene(root);

        stage.setScene(scene);
        stage.show();
    }


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

Вот моя страница sample.f xml, которая находится в том же пакете View:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane fx:id="sample_page" prefHeight="681.0" prefWidth="503.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="view.SampleController">
  <children>

      <Button fx:id="btn_import_file" layoutX="403.0" layoutY="532.0" mnemonicParsing="false" text="Import File" />
  </children>
</AnchorPane>

Вот мой SampleController. java class:

package view;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage; 
import javafx.stage.FileChooser;
import java.io.File;



public class SampleController implements Initializable {



    @FXML
    private AnchorPane samplePage;

    @FXML
    private Button btn_test_dialog;
    //this tests the operation of the alert dialog

   //private Stage export_chooser_stage;


    @FXML
    private Button export_posts_all;
    // this tests the file path select


    @FXML
    private Button btnImportFile;
    // this tests the import file path and name.





    //===================================================================================================================
    /*
     * This method will initialiise the UI
     */

    @Override
    public void initialize(URL url, ResourceBundle rb) 
    {
        //--------------------------------------------------------------------------------------------------------------------
        /*
         * This  is the  btn_import_file.setOnAction((event)
         */
        btnImportFile.setOnAction((event) -> 
        {
            Stage primaryStage=(Stage) samplePage.getScene().getWindow();
            //Stage primaryStage=new Stage();
            primaryStage.setTitle("JavaFX App");

            FileChooser fileChooser = new FileChooser();

            Button button = new Button("Select File");
            button.setOnAction(e -> {
                File selectedFile = fileChooser.showOpenDialog(primaryStage);
                String FileNamePath=selectedFile.toString();
                System.out.println("File name and path to file :"+FileNamePath); 
            });

            //VBox vBox = new VBox(button);
            //Scene scene = new Scene(vBox, 960, 600);

            //primaryStage.setScene(sample_page.getScene());
            primaryStage.getScene();
            primaryStage.show();
        });
        // this closes the  btn_test_dialog.setOnAction((event) ->  event


    }// close public void initialize(URL url, ResourceBundle rb)     



}// close public class SampleController implements Initializable 

Происходит следующее:

1. страница загружается и отображает кнопку «Импортировать файл»

Когда один onClick «Импортировать файл» ничего не происходит.

Ожидаемое поведение при onClicking «Импортировать файл» должно быть:

  1. Файл операционной системы Диалог выбора должен появиться над тем же этапом, что и кнопка «Импортировать файл». При выборе файла и пути должно быть напечатано имя файла и путь к файлу: в консоли.

  2. Ясно, что в моем коде есть проблема, потому что я новичокb ie to Java FX.

Сможет ли кто-нибудь мне помочь?

1 Ответ

0 голосов
/ 20 июня 2020

исправьте ваш Sample.fxml файл, чтобы fx:id соответствовал тому, что находится в контроллере ... измените это:

<AnchorPane fx:id="sample_page" prefHeight="681.0" prefWidth="503.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="view.SampleController">
  <children>

      <Button fx:id="btn_import_file" layoutX="403.0" layoutY="532.0" mnemonicParsing="false" text="Import File" />

на это:

<AnchorPane fx:id="samplePage" prefHeight="681.0" prefWidth="503.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="view.SampleController">
  <children>

      <Button fx:id="btnImportFile" layoutX="403.0" layoutY="532.0" mnemonicParsing="false" text="Import File" />

В вашем контроллере, вы никогда не добавляете новую кнопку в представление, поэтому вы никогда не нажмете ее ActionEvent

Измените свой контроллер следующим образом:

        btnImportFile.setOnAction((event) -> {
            // Get the window for the current view to pass to the
            // FileChooser showOpenDialog()
            Window      primaryStage = samplePage.getScene().getWindow();
            FileChooser fileChooser  = new FileChooser();

            Button button = new Button("Select File");
            // Add your new button to this view
            // What will you do with this button after?  How will you dispose of it?
            samplePage.getChildren().add(button);
            button.setOnAction(e -> {
                File   selectedFile = fileChooser.showOpenDialog(primaryStage);

                // This will NPE if user cancels showOpenDialog.. 
                // and shpuld be `fileNamePath`
                // and I think you want `selectedFile.getPath()`
                // or `selectedFile.getAbsolutePath()`
                String FileNamePath = selectedFile.toString();
                System.out.println("File name and path to file :" + FileNamePath);
            });
        });
...