【问题标题】:How to open FileDialog on top of all windows如何在所有窗口顶部打开 FileDialog
【发布时间】:2019-08-12 08:20:09
【问题描述】:

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

对于 Windows,我使用 JFileChooser 和 JDialog,但在 MAC 中使用它们会挂起应用程序,因此我将 FileDialog 用于 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 也无济于事。

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

【问题讨论】:

    标签: java macos filedialog


    【解决方案1】:

    我不明白为什么在 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!");
            }
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 2014-06-24
      • 2013-04-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      相关资源
      最近更新 更多