【问题标题】:How to launch a file in the foreground?如何在前台启动文件?
【发布时间】:2011-12-18 08:08:04
【问题描述】:

启动文件 = 启动与给定文件关联的程序,并在程序启动时自动打开该文件。

假设我运行 IntelliJ IDEA,我运行我的代码并显示我的程序的主窗口(模式)。我的程序在前台。

然后我从我的程序中启动一个 .pdf 文件(现在这意味着将执行 AcroReader)。 AA 将出现在 IntelliJ 前面,但在我的程序后面。

问题

我希望 AA(当然这里只是一个示例)显示在我的程序前面,而不是后面。怎么做?

请注意,这并不意味着我想将我的程序移到后台!

为了启动我使用的文件

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

我的 GUI 是在 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 的左上角靠近我的应用程序的右下角。

【问题讨论】:

  • 我认为它最终会出现在前台如果您的程序没有进行任何 UI 活动。您是否启动您的 PDF,然后提出提示或其他内容?您是否尝试过提出提示,然后再启动 PDF。不知道你怎么能做到这一点。
  • 好点,但现在我简化了 UI 以检查您的想法,并且启动文件没有任何变化。我会在一秒钟内更新我的问题。
  • 我尝试过使用 JFrame 和 JDialog,使用 pdf、xlsx 和 zip - 外部应用程序始终在 Java UI 前打开。我在 Ubuntu 上。
  • 如何使用方法 toBack() - 来自 java.awt.Window(它在 Dialog 中被覆盖)
  • @Ivan Sopov,你能粘贴一段代码(作为答案)吗?您使用什么桌面环境?统一? toBack() 为我的应用程序 - 这意味着我每次启动文件时都必须将它放回所有其他窗口。

标签: java window execute foreground file-association


【解决方案1】:

你可以试试这样的。在我的机器(带有 Gnome2 的 Ubuntu 10.4 LTS)上,它在前面提供了 evince(pdf-viewer),如果我关闭/隐藏 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);
        }
    });
}
}

【讨论】:

  • 等等,如果你删除“dlg.toBack()”,你的电脑会发生什么?在我的情况下(带有 KDE3.5.10 的 opnSUSE),没有 - 正如我在 OP 中描述的那样,现在两个窗口都落后于 IntelliJ IDEA。
  • 如果我删除“dlg.toBack()”,pdf-viewer 会出现在前面。 JDialog 出现在 pdf-viewer 后面,如果我关闭/隐藏 pdf 查看器(如果我没有切换到其他窗口 - Eclipse、文件浏览器等),对话框将获得焦点。与“dlg.toBack()”的唯一区别是打开后pdf-viewer JDialog 落后于 Eclipse。关闭 pdf-viewer 后,它会回到前面。
  • 我仍然认为,如果您开发通用应用程序-最好在 Windows 上进行测试。如果它是在 linux 上供内部使用的企业应用程序 - 我认为用户可能会在后台打开文件;-)
  • 谢谢,所以很可能是“Swing in KDE”问题。可惜:-(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多