lss233 2 min read

FileChooser类 提供了标准平台文件对话框的支持。这些对话框拥有JavaFX的外观效果。

一个FileChooser可以用来调用文件打开的对话框选择单个文件(showOpenDialog)、文件打开对话框中选择多个文件(showOpenMultipleDialog)和文件保存对话框(showSaveDialog)。显示的对话框的配置由的值来控制FileChooser相应的之前设置的showDialog属性方法。此配置包括该对话框的标题,对话框和列出的文件扩展名过滤器(S)中显示的初始目录。对于价值尚未确定明确的配置属性,显示的对话框使用他们的平台默认值。一个对话框显示方法的调用被阻塞,直到用户做出选择或取消对话框。如果对话框被取消,将返回null*.

FileChooserDemo.java:

package top.lss233.demo;
import java.io.File;
import javax.annotation.PostConstruct;
import io.datafx.controller.FXMLController;
import io.datafx.controller.flow.FlowException;
import io.datafx.controller.flow.context.FXMLViewFlowContext;
import io.datafx.controller.flow.context.ViewFlowContext; 
import io.datafx.controller.util.VetoException;
import javafx.fxml.FXML; import javafx.stage.FileChooser;
import javafx.stage.Stage;
@FXMLController(value = "/resources/fxml/FileChooserDemo.fxml", title = "FileChooserDemo")
public class FileChooserDemo {
   @FXMLViewFlowContext
   private ViewFlowContext context;
   @FXML
   private Button browseFile;
   @PostConstruct
   public void init() throws FlowException, VetoException {
    final Stage stage = (Stage) context.getRegisteredObject("Stage");
    browseFile.setOnMouseClickedEvent(()->{
     FileChooser fileChooser = new FileChooser();
     fileChooser.setTitle("打开资源文件");
     fileChooser.getExtensionFilters().addAll(
      new ExtensionFilter("文本文档", "*.txt"),
      new ExtensionFilter("图片文件", "*.png", "*.jpg", "*.gif"),
      new ExtensionFilter("音频文件", "*.wav", "*.mp3", "*.aac"),
      new ExtensionFilter("所有文件", "*.*"));
     File selectedFile = fileChooser.showOpenDialog(stage);
     if (selectedFile != null)
       stage.display(selectedFile);
     });
    }
}

FileChooserDemo.fxml:

<?xml version="1.0" encoding="UTF-8"?>
 <?import javafx.scene.layout.*?>
 <?import javafx.scene.control.Label?>
 <?import javafx.geometry.Insets?>
 <StackPane fx:id="root" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">
  <VBox>
   <HBox >
    <Button fx:id="browseFile">
    </Button>
   </HBox>
  </VBox>
 </StackPane>

效果图如下: