Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从控制器类打开JavaFXFileChooser?_Java_Javafx_Filechooser - Fatal编程技术网

如何从控制器类打开JavaFXFileChooser?

如何从控制器类打开JavaFXFileChooser?,java,javafx,filechooser,Java,Javafx,Filechooser,我的问题是,所有使用FileChooser的示例都要求您通过一个阶段。唯一的问题是我的UI是在一个fxml文件中定义的,该文件使用一个与主阶段分离的控制器类 @FXML protected void locateFile(ActionEvent event) { FileChooser chooser = new FileChooser(); chooser.setTitle("Open File"); chooser.showOpenDialog(???); } 我应

我的问题是,所有使用
FileChooser
的示例都要求您通过一个阶段。唯一的问题是我的UI是在一个
fxml
文件中定义的,该文件使用一个与主阶段分离的控制器类

@FXML protected void locateFile(ActionEvent event) {
    FileChooser chooser = new FileChooser();
    chooser.setTitle("Open File");
    chooser.showOpenDialog(???);
}

我应该在
中添加什么才能使其正常工作?就像我说的,我没有对控制器类中任何阶段的任何引用,那么我该怎么办呢?

对于场景中的任何节点(例如,根节点;但是您注入的任何节点都可以
@FXML
),我该怎么办


您不必坚持应用程序中创建的阶段,您可以:

@FXML protected void locateFile(ActionEvent event) {
    FileChooser chooser = new FileChooser();
    chooser.setTitle("Open File");
    File file = chooser.showOpenDialog(new Stage());
}
或者,如果您想继续使用同一阶段,则必须在以下操作之前将该阶段传递给控制器:

    FXMLLoader loader = new FXMLLoader(getClass().getResource("yourFXMLDocument.fxml"));
    Parent root = (Parent)loader.load();
    MyController myController = loader.getController();
    myController.setStage(stage);
您可以在那里使用应用程序的主阶段。

从菜单项

public class SerialDecoderController implements Initializable {

  @FXML
  private MenuItem fileOpen;

  @Override
  public void initialize(URL url, ResourceBundle rb) {
    // TODO
 }    


public void fileOpen (ActionEvent event) {

    FileChooser fileChooser = new FileChooser();
    fileChooser.setTitle("Open Resource File"); 
    fileChooser.showOpenDialog(fileOpen.getParentPopup().getScene().getWindow());

}

或者,对我有效的方法是:简单地说
null

@FXML
private void onClick(ActionEvent event) {
    File file = fileChooser.showOpenDialog(null);
    if (file != null) {
       //TODO
    }
}

我从哪里得到根节点?我必须定义一个
fx:id
,还是我完全没有这个想法?是的,定义一个
fx:id
。但您不必使用根节点,只需使用任何已具有
fx:id
并已注入控制器的对象(所有节点都在同一场景中…)。您还可以执行
Node Node=(Node)event.getSource()@FXML
private void onClick(ActionEvent event) {
    File file = fileChooser.showOpenDialog(null);
    if (file != null) {
       //TODO
    }
}