Как открыть FileDialog поверх всех окон

У меня есть приложение Java Swings, в котором я открываю диалоговое окно File Browser.

Для 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 также не помогает.

Итак, как я могу открыть его поверх всех открытых приложений?


person Hemant Sisodia    schedule 12.08.2019    source источник


Ответы (1)


Я не понимаю, почему использование JFileChooser должно зависать в вашем приложении при использовании на MAC... этого не должно быть, но опять же я читал, что Swing может делать странные вещи на MAC из-за EDT. Однако я не могу лично подтвердить это, так как никогда не работал с MAC.

Одним из решений может быть запуск диалога в отдельном потоке, что позволяет JFileChooser функционировать независимо от EDT и, следовательно, не представляет для него никакой угрозы.

Что касается вашего диалогового окна выбора файлов, скрытого за вашим приложением Swing, я думаю, это может быть из-за того, что JFrame вашего приложения установлен на Всегда поверх, и даже несмотря на то, что диалоговое окно 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!");
        }
    }
});
person DevilsHnd    schedule 12.08.2019