gpt4 book ai didi

java - 如何在所有窗口顶部打开FileDialog

转载 作者:行者123 更新时间:2023-12-02 09:36:37 25 4
gpt4 key购买 nike

我有一个 Java Swings 应用程序,我在其中打开文件浏览器对话框。

对于 Windows,我使用 JFileChooser 和 JDialog,但在 MAC 中使用它们会挂起应用程序,因此我使用 FileDialog for MAC。

这是我正在使用的代码:

        Frame frame = null;
FileDialog fd = new FileDialog(frame, "Select Cover Photo", FileDialog.LOAD);
fd.setFilenameFilter((File dir, String name) -> name.endsWith(".jpg"));
fd.setAlwaysOnTop(true);
fd.setVisible(true);
String filename = new File(fd.getDirectory(), fd.getFile()).getAbsolutePath();

这在 MAC 中也能正常工作,但只有当我保持任何浏览器打开时,它才会在浏览器后面打开,而不是在上面打开。

使用 Frame not as null 也没有帮助。

那么如何在所有打开的应用程序之上打开它?

最佳答案

我不明白为什么在 MAC 上使用时使用 JFileChooser 会挂起您的应用程序...它不应该,但我又读到了由于 EDT,Swing可能在 MAC 上做一些奇怪的事情。但我个人无法证实这一点,因为我从未使用过 MAC。

一种解决方案可能是在单独的线程中运行该对话框,从而允许 JFileChooser 独立于 EDT 运行,从而不会对其构成任何威胁。

至于您的文件选择器对话框隐藏在 Swing 应用程序后面,我认为这可能是因为您的应用程序的 JFrame 设置为 Always-On-Top,即使 FileChooser 对话框被认为是模态的(事实确实如此)并不意味着如果 null 用作其父组件,它将显示在所有内容之上。对话框的父级本身也应该设置为Always-On-Top。无论对话框在什么操作系统中显示,通常都是这种情况。无论 JFileChooser 或 JOptionPane (等)对话框对于父对话框可能是什么,或者实际上根本没有父对话框,以下代码都应该有效:

final JFrame iFRAME = new JFrame();
iFRAME.setAlwaysOnTop(true); // ****
iFRAME.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
iFRAME.setLocationRelativeTo(null);
iFRAME.requestFocus();

JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
int returnValue = jfc.showOpenDialog(iFRAME);
iFRAME.dispose();
if (returnValue == JFileChooser.APPROVE_OPTION) {
File selectedFile = jfc.getSelectedFile();
// Display selected file in console
System.out.println(selectedFile.getAbsolutePath());
}
else {
System.out.println("No File Selected!");
}

事实上,您的应用程序在 MAC 中运行时会崩溃,您可能需要尝试以下操作:

final JFrame iFRAME = new JFrame();
iFRAME.setAlwaysOnTop(true); // ****
iFRAME.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
iFRAME.setLocationRelativeTo(null);
iFRAME.requestFocus();

EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
int returnValue = jfc.showOpenDialog(iFRAME); // ****
iFRAME.dispose();
if (returnValue == JFileChooser.APPROVE_OPTION) {
File selectedFile = jfc.getSelectedFile();
// Display selected file in console
System.out.println(selectedFile.getAbsolutePath());
}
else {
System.out.println("No File Selected!");
}
}
});

关于java - 如何在所有窗口顶部打开FileDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57457746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com