У меня проблемы с получением сцены для пункта меню Java FX - PullRequest
0 голосов
/ 21 июня 2020

Я работаю над заданием java, и поэтому я не совсем «мастер-джедай», когда дело доходит до Java, а на самом деле больше на «стадии обучающих колес», и поэтому все еще пытаюсь понять Java FX этапы и сцены ... в любом случае вот какой-то код прототипа, который показывает мою проблему ...

[Все они находятся в пакете testingMenuAction]

My основной класс: «testingMenuAction_main. java»

package testingMenuAction;

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


public class testingMenuAction_main extends Application {
    
    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("/testingMenuAction/testingMenuAction.fxml"));
        
        Scene scene = new Scene(root);
        
        stage.setScene(scene);
        stage.show();
    }


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

Мой основной Java F XML файл: «testingMenuAction.f xml»

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

<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>

<AnchorPane fx:id="testingMenuActionPage" prefHeight="195.0" prefWidth="494.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="testingMenuAction.testingMenuActionController">
  <children>
      <VBox prefHeight="186.0" prefWidth="493.0">
         <children>
            <MenuBar>
              <menus>
                <Menu mnemonicParsing="false" text="Data">
                  <items>
                    <MenuItem fx:id="mnu_data_import" mnemonicParsing="false" text="Import File" />
                  </items>
                </Menu>
              </menus>
            </MenuBar>
         </children>
      </VBox>
  </children>
</AnchorPane>

Мой класс контроллера для моего Java F XML файла: "testingMenuActionController. java"

package testingMenuAction;

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





public class testingMenuActionController implements Initializable {
    

    
    @FXML
    private AnchorPane testingMenuActionPage;
    
    @FXML
    private MenuItem mnu_data_import;
    //this tests the operation of the alert dialog
    
   //private Stage export_chooser_stage;
    


    
 
    //===================================================================================================================
    /*
     * This method will initialiise the UI
     */
    
    @Override
    public void initialize(URL url, ResourceBundle rb) 
    {
        
        //--------------------------------------------------------------------------------------------------------------------
        /*
         * This  is the mnu_data_import.setOnAction((event)
         */
            mnu_data_import.setOnAction((event) -> 
            {
                System.out.println("You clicked to Import Data");
                FileChooser fileChooser = new FileChooser();
                fileChooser.setTitle("Open Resource File");
                fileChooser.getExtensionFilters().addAll(
                 new ExtensionFilter("Text Files", "*.csv")  );
                File selectedFile = fileChooser.showOpenDialog(  mnu_data_import.getScene().getWindow()  );
                String FileNamePath = selectedFile.toString();
                System.out.println("File name and path to file :" + FileNamePath);
                
                
            });// close
  
        
    }// close public void initialize(URL url, ResourceBundle rb)     

  
    
}// close public class testingMenuActionController

Компилятор жалуется на следующую инструкцию :

"File selectedFile = fileChooser.showOpenDialog(  mnu_data_import.getScene().getWindow()  );"

Появляется следующее сообщение об ошибке ... «Метод getScene () не определен для типа MenuItem»

К сожалению, мой опыт работы с Java Windows, Сцена, Сцены и Узлы все еще малы [поскольку я все еще на своих "колесах тренера .."] ... т, кто-нибудь сможет мне помочь?

Ответы [ 2 ]

3 голосов
/ 21 июня 2020

Нет такого метода getScene() для класса MenuItem, см. эту страницу документации .

Я думаю, вы пытаетесь найти окно владельца, чтобы вы могли его передать по методу showOpenDialog(). Что вы действительно можете сделать, так это использовать метод getScene() не на вашем MenuItem (поскольку он не имеет метода getScene()), а скорее на вашем элементе root, в данном случае testingMenuActionPage. (Примечание: его можно вызвать для любого элемента, наследующего класс Node)

mnu_data_import.setOnAction((event) ->
{
    System.out.println("You clicked to Import Data");
    FileChooser fileChooser = new FileChooser();
    fileChooser.setTitle("Open Resource File");
    fileChooser.getExtensionFilters().addAll(new ExtensionFilter("Text Files", "*.csv")  );
    File selectedFile = fileChooser.showOpenDialog(testingMenuActionPage.getScene().getWindow());
    String FileNamePath = selectedFile.toString();
    System.out.println("File name and path to file :" + FileNamePath);
});
0 голосов
/ 21 июня 2020

Как предлагается в моем комментарии, вместо mnu_data_import.getScene().getWindow() измените его на testingMenuActionPage.getScene().getWindow(), потому что MenuItem не имеет метода getScene() напрямую, а также проверьте, существует ли / был ли выбран File.

Ваш initialize Метод может выглядеть так:

@Override
public void initialize(URL url, ResourceBundle rb) 
{
    
    //--------------------------------------------------------------------------------------------------------------------
    /*
     * This  is the mnu_data_import.setOnAction((event)
     */
        mnu_data_import.setOnAction((event) -> 
        {
            System.out.println("You clicked to Import Data");
            FileChooser fileChooser = new FileChooser();
            fileChooser.setTitle("Open Resource File");
            fileChooser.getExtensionFilters().addAll(
             new ExtensionFilter("Text Files", "*.csv")  );
            File selectedFile = fileChooser.showOpenDialog(testingMenuActionPage .getScene().getWindow());
            // check if file has been choosed
            if (selectedFile != null) {

              String FileNamePath = selectedFile.toString();
              System.out.println("File name and path to file :" + FileNamePath);


            } else {
            // file not choosed, cancel button has been clicked
            // do something here
            }
            
        });// close

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