- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的 View Controller 有一个 FileChooser
实例用于打开和保存文件。
每次我从该实例调用 showOpenDialog()
或 showSaveDialog()
时,我希望生成的对话框与我上次离开时位于同一目录中我调用其中一个。
相反,每次我调用其中一个方法时,对话框都会在用户主目录中打开。
如何使对话框的“当前目录”在不同的调用中保持不变?
当前行为示例:
import java.io.File;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
/**
* Demonstrates the use of an open dialog.
*
* @author N99x
*/
public class FileChooserTest extends Application {
private final FileChooser open = new FileChooser();
private File lastOpened = null;
@Override
public void start(Stage primaryStage) {
Label lbl = new Label("File Opened: <null>");
lbl.setPadding(new Insets(8));
Button btn = new Button();
btn.setPadding(new Insets(8));
btn.setText("Open");
btn.setOnAction((ActionEvent event) -> {
open.setInitialDirectory(lastOpened);
File selected = open.showOpenDialog(primaryStage);
if (selected == null) {
lbl.setText("File Opened: <null>");
// lastOpened = ??;
} else {
lbl.setText("File Opened: " + selected.getAbsolutePath());
lastOpened = selected.getParentFile();
}
});
VBox root = new VBox(lbl, btn);
root.setPadding(new Insets(8));
root.setAlignment(Pos.TOP_CENTER);
Scene scene = new Scene(root, 300, 300);
primaryStage.setTitle("FileChooser Testing!");
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
我设法通过存储打开的值解决了部分问题,但如果对话框关闭或取消,这将不起作用。
最佳答案
How do I make the "current directory" of the dialogs persist across different invocations?
您可以修改 Singleton Pattern方法
因此您将只使用一个 FileChooser
并监视/控制那里的初始目录,但不会直接将实例暴露给类外的修改
例如:
public class RetentionFileChooser {
private static FileChooser instance = null;
private static SimpleObjectProperty<File> lastKnownDirectoryProperty = new SimpleObjectProperty<>();
private RetentionFileChooser(){ }
private static FileChooser getInstance(){
if(instance == null) {
instance = new FileChooser();
instance.initialDirectoryProperty().bindBidirectional(lastKnownDirectoryProperty);
//Set the FileExtensions you want to allow
instance.getExtensionFilters().setAll(new ExtensionFilter("png files (*.png)", "*.png"));
}
return instance;
}
public static File showOpenDialog(){
return showOpenDialog(null);
}
public static File showOpenDialog(Window ownerWindow){
File chosenFile = getInstance().showOpenDialog(ownerWindow);
if(chosenFile != null){
//Set the property to the directory of the chosenFile so the fileChooser will open here next
lastKnownDirectoryProperty.setValue(chosenFile.getParentFile());
}
return chosenFile;
}
public static File showSaveDialog(){
return showSaveDialog(null);
}
public static File showSaveDialog(Window ownerWindow){
File chosenFile = getInstance().showSaveDialog(ownerWindow);
if(chosenFile != null){
//Set the property to the directory of the chosenFile so the fileChooser will open here next
lastKnownDirectoryProperty.setValue(chosenFile.getParentFile());
}
return chosenFile;
}
}
这会将 FileChooser
的初始目录设置为用户在重新使用时上次打开/保存的文件的目录
示例用法:
File chosenFile = RetentionFileChooser.showOpenDialog();
但是这里有一个限制:
//Set the FileExtensions you want to allow
instance.getExtensionFilters().setAll(new ExtensionFilter("png files (*.png)", "*.png"));
由于不提供任何 ExtensionFilter
,FileChooser
变得不太用户友好,需要用户手动附加文件类型,但在创建实例时提供过滤器无法更新它们将其限制为那些相同的过滤器
对此进行改进的一种方法是在 RetentionFileChooser
中公开可选过滤器,可以使用 varargs 提供。 ,您可以在显示对话框时选择何时修改过滤器
例如,在之前的基础上构建:
public class RetentionFileChooser {
public enum FilterMode {
//Setup supported filters
PNG_FILES("png files (*.png)", "*.png"),
TXT_FILES("txt files (*.txt)", "*.txt");
private ExtensionFilter extensionFilter;
FilterMode(String extensionDisplayName, String... extensions){
extensionFilter = new ExtensionFilter(extensionDisplayName, extensions);
}
public ExtensionFilter getExtensionFilter(){
return extensionFilter;
}
}
private static FileChooser instance = null;
private static SimpleObjectProperty<File> lastKnownDirectoryProperty = new SimpleObjectProperty<>();
private RetentionFileChooser(){ }
private static FileChooser getInstance(FilterMode... filterModes){
if(instance == null) {
instance = new FileChooser();
instance.initialDirectoryProperty().bindBidirectional(lastKnownDirectoryProperty);
}
//Set the filters to those provided
//You could add check's to ensure that a default filter is included, adding it if need be
instance.getExtensionFilters().setAll(
Arrays.stream(filterModes)
.map(FilterMode::getExtensionFilter)
.collect(Collectors.toList()));
return instance;
}
public static File showOpenDialog(FilterMode... filterModes){
return showOpenDialog(null, filterModes);
}
public static File showOpenDialog(Window ownerWindow, FilterMode...filterModes){
File chosenFile = getInstance(filterModes).showOpenDialog(ownerWindow);
if(chosenFile != null){
lastKnownDirectoryProperty.setValue(chosenFile.getParentFile());
}
return chosenFile;
}
public static File showSaveDialog(FilterMode... filterModes){
return showSaveDialog(null, filterModes);
}
public static File showSaveDialog(Window ownerWindow, FilterMode... filterModes){
File chosenFile = getInstance(filterModes).showSaveDialog(ownerWindow);
if(chosenFile != null){
lastKnownDirectoryProperty.setValue(chosenFile.getParentFile());
}
return chosenFile;
}
}
示例用法:
//Note the previous example still holds
File chosenFile = RetentionFileChooser.showOpenDialog();
File file = RetentionFileChooser.showSaveDialog(FilterMode.PNG_FILES);
but this does not work if the dialog is closed or canceled.
不幸的是,FileChooser
没有公开有关在关闭/终止之前正在检查的目录的信息。如果您反编译该类并进行跟踪,它最终会遇到一个 native
调用。因此,即使 FileChooser
不是 final
允许它被子类化,它也不太可能获得此信息
上述方法提供的唯一好处是,如果遇到这种情况,它不会更改初始目录
如果您有兴趣,在这个问题和链接中的 native
关键词上有一些非常好的答案:
关于java - JavaFX FileChooser "remember"可以是它打开的最后一个目录吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36920131/
我在学习JavaFx的过程中,遇到了一个问题。我正在尝试使用 JavaFx 中的 FileChooser,就像我习惯于在 main() 方法中使用 Swing 中的 JFileChooser 一样。但
我正在尝试在 cn1 中使用 FileChooser。我已按照此处的说明进行操作: Codename One 和 GitHub 我添加了扩展,然后刷新了我的 cn1libs 完成此操作后,我将代码示例
我应该如何将 javafx.stage.FileChooser 添加到 javafx gui 应用程序的场景中。 我做了以下 Group root = new Group(); Scene scene
我想知道如何更改 FileChooserListView 和 FileChooserIconView 的字体颜色(文本颜色)。 我可以更改背景颜色(为白色),我想将字体颜色更改为黑色。 我该怎么做?
我不知道为什么,但如果我单击“提交”或“取消”,则会打开 showOpenDialog() 的第二个窗口。我尝试了 JFileChooser 但出现了同样的问题。 private void menu
是否可以使用 JavaFX 文件选择器(或类似的替代方法)来创建新文件? 输入不存在文件的名称在 Linux 上有效(准确地说是 Ubuntu),但在 Windows 上文件选择器不允许这样做。 最佳
我正在寻找 javafx FileChooser(在 Kotlin 中)的解决方案。我坚持这一点,我无法通过 Root View ,因为 Window! 是预期的: button("open some
版本 python :3.7 操作系统:Windows 10 基维:1.11.1 kivy安装方式:pip 描述 FileChooser 在文件列表中滚动时重叠文本。看起来第一个内容保留下来并且在滚动
我正在尝试使用 FileChooser,但我对如何打开所选文件感到困惑。由于文件可以是任何类型 - pdf、docx 等,如何在 codenameone 中显示文件或为用户提供选择首选应用程序打开它的
我有一个可写图像,我想使用 FileChooser 保存。我该怎么做,因为它不适用于此代码: public void handle(ActionEvent event) { Fil
我正在尝试制作一个程序来存储您选择的文件夹的路径。问题是,当我尝试存储字符串的路径时,它不存储完整目录。 如果我选择“C:\Users\n\Documents\English”,它将存储“C:\Use
您好,我正在使用 Java Swing 开发一个程序,并且设置了 4 个选项 Pane 来获取某些输入,但是当我运行该程序时,它会显示选项窗口,但当我关闭选项 Pane 时它运行并运行最后一个按钮,我
如何使用 FileDialog 选择不同目录中的多个文件? 我需要创建一个用户界面,在其中需要添加来自不同目录的大量文件。另外,我需要创建一个复选框来指示选择哪些文件进行进一步操作。 我尝试使用 SW
如何才能只允许用户打开特定文件? 就我而言,我只想允许打开“myapplication.exe”文件,该文件可能位于我的文件系统上的某个位置,所以这就是我需要FileChooser的原因>. 我只知道
我想要做的是使用FileChooser来选择路径。 选择后,该路径应由以下实例使用。 我的问题是如何强制所有内容在路径上等待,因为否则程序只是运行而不等待。 //GUI JFrame
我正在做作业。基本上作业已经完成,但我试图通过向其添加 GUI 来使其变得更好。 但是我在 FileChooser 上遇到了一些问题,因为我不太明白它是如何工作的。 import javax.swin
我的图像查看器出现问题,它要求我的文件选择器返回方法。该程序应该为一只猫打开一张图片。 我不知道如何修复我的语法错误。 我只是想解决图像查看器方法中文件选择器的问题,继续查看是否有更多问题,我是 GU
我的代码应该从 JFileChooser 中选择一个文件夹,但即使我使用 fs.setDialogType,它的行为仍然像选择文件一样。我尝试了 showSaveDialog 和 showOpenDi
在我的项目中,我使用 JavaFX FileChooser 让用户保存文件。我注意到一个错误,其中具有指定文件过滤器的文件在 Linux 系统上总是保存为 .txt。从另一个 stackoverflo
我使用以下代码选择大约 800 个图像文件,每个图像文件大小为 5 MB: List flist = fileChooser.showOpenMultipleDialog(label.getScene
我是一名优秀的程序员,十分优秀!