Как запустить файл на переднем плане?

#java #window #execute #foreground #file-association

#java #окно #выполнить #передний план #ассоциация файлов

Вопрос:

Запуск файла = запуск программы, связанной с данным файлом, и автоматическое открытие этого файла при запуске программы.

Допустим, я запускаю IntelliJ IDEA, я запускаю свой код, и появляется главное окно (модальное) моей программы. Моя программа находится на переднем плане.

Затем я запускаю файл .pdf (на данный момент это означает, что AcroReader будет выполнен) из моей программы. AA будет отображаться перед IntelliJ, но позади моей программы.

Вопрос

Я бы хотел, чтобы AA (здесь, конечно, это просто пример) отображался перед моей программой, а не позади. Как это сделать?

Пожалуйста, обратите внимание, это не означает, что я хотел бы переместить свою программу на задний план!

Для запуска файлов я использую

 java.awt.Desktop.getDesktop().open(new java.io.File(filepath));
  

Мой графический интерфейс выполнен в Swing.

Обновление 1

Чтобы исключить любое влияние пользовательских виджетов, событий и т. Д., Я просто помещаю JButton в нижней части моего окна (JDialog) — это в Scala, но эта часть похожа на синтаксис Java:

 var dlg = new javax.swing.JDialog(null,"test",Dialog.ModalityType.DOCUMENT_MODAL);
dlg.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

var button = new JButton("Select Me");
var actionListener = new ActionListener() {
      def actionPerformed( actionEvent : ActionEvent) = {
        java.awt.Desktop.getDesktop().open(new java.io.File("test.pdf"))
      }
    };

button.addActionListener(actionListener);
dlg.add(button, BorderLayout.SOUTH);
dlg.setSize(300, 100);
dlg.setVisible(true);
  

После нажатия AA отображается за моим приложением. Поскольку для запуска AA требуется несколько секунд, я также попытался нажать кнопку и переместить мышь подальше от моего окна. Точно такое же поведение.

Я также отметил, что AA отображается в том же положении относительно моего окна, верхний левый угол AA находится рядом с нижним правым углом моего приложения.

Комментарии:

1. Я бы подумал, что он окажется на переднем плане, если ваша программа не выполняет никаких действий пользовательского интерфейса. Вы запускаете свой PDF-файл, а затем выводите подсказку или что-то в этом роде? Вы пробовали запускать приглашение, а затем запускать PDF-файл. Не уверен, как вы можете это сделать.

2. Хорошая мысль, но теперь я упростил пользовательский интерфейс, чтобы проверить вашу идею, и никаких изменений в запуске файла нет. Я обновлю свой вопрос через секунду.

3. Я пробовал как с JFrame, так и с JDialog, с pdf, xlsx и zip — все время внешние приложения открывались перед интерфейсом java. Я на Ubuntu.

4. как насчет использования метода toBack() — из java.awt.Window (он переопределяется в диалоговом окне)

5. @Ivan Sopov, ты можешь вставить фрагмент кода (в качестве ответа)? Какую среду рабочего стола вы используете? Единство? toBack() для моего приложения — это означало бы, что я должен возвращать его обратно во все другие окна при каждом запуске файла.

Ответ №1:

Вы можете попробовать что-то вроде этого. На моей машине (Ubuntu 10.4 LTS с Gnome2) он выдает evince (средство просмотра pdf) спереди, и если я закрою / скрою evince — JDialog будет помещен обратно на передний план.

В Windows это может сильно отличаться, поскольку на самом деле без «dlg.toBack();» поведение вызова такое же.

 import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class OpenFileTest {

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            final JDialog dlg = new javax.swing.JDialog(null, "test", JDialog.ModalityType.DOCUMENT_MODAL);
            dlg.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            JButton button = new JButton("Select Me");
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        java.awt.Desktop.getDesktop().open(
                                new java.io.File("/home/user/Downloads/jfreechart-1.0.13-US.pdf"));
                        dlg.toBack();
                    } catch (IOException e1) {
                        throw new RuntimeException(e1);
                    }
                }
            });
            dlg.add(button);
            dlg.setVisible(true);
        }
    });
}
}
  

Комментарии:

1. Подождите, что произойдет на вашем компьютере, если вы удалите «dlg.toBack()»? В моем случае (opnSUSE с KDE3.5.10), без — как я описал в OP, остроумие — теперь оба окна находятся за IntelliJ IDEA.

2. Если я удалю «dlg.toBack ()», программа просмотра pdf выйдет на передний план. JDialog отображается за средством просмотра pdf, и диалоговое окно получает фокус, если я закрываю / скрываю средство просмотра pdf (если я не переключился на другие окна — Eclipse, File browser и т. Д.) Единственное отличие от «dlg.toBack()» заключается в том, что после открытия программы просмотра pdf JDialog переходит за Eclipse. После того, как я закрываю программу просмотра pdf, она возвращается на передний план.

3. Тем не менее, я думаю, что если вы разрабатываете приложение общего назначения — лучше тестировать на Windows. Если это корпоративное приложение для внутреннего использования в Linux — я думаю, пользователи могут жить с открытием файлов в фоновом режиме 😉

4. Спасибо, так что, скорее всего, это проблема «Swing в KDE». Жаль 🙁