Java 如何在前台启动文件?

Java 如何在前台启动文件?,java,window,execute,foreground,file-association,Java,Window,Execute,Foreground,File Association,启动文件=启动与给定文件关联的程序,并在程序启动时自动打开该文件 比如说,我运行IntelliJ IDEA,运行代码,程序的主窗口(模式)显示出来。我的程序在前台 然后我从我的程序中启动一个.pdf文件(现在它意味着AcroReader将被执行)。AA将出现在IntelliJ前面,但在我的程序后面 问题: 我希望AA(当然,这只是一个例子)显示在我的程序前面,而不是后面。怎么做 请注意,这并不意味着我想把我的程序移到后台 用于启动我使用的文件 我的GUI在Swing中完成 更新1 为了排除自定义

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

比如说,我运行IntelliJ IDEA,运行代码,程序的主窗口(模式)显示出来。我的程序在前台

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

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

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

用于启动我使用的文件

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

您可以尝试类似的方法。在我的机器上(带有Gnome2的Ubuntu10.4LTS),它在前面提供了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);
        }
    });
}
}

我认为如果你的程序不进行任何UI活动,它最终会出现在前台。你会启动你的PDF然后发布一个提示吗?您是否尝试过在弹出提示后启动PDF。我不知道你是怎么做到的。说得好,但现在我简化了用户界面来验证你的想法,并且启动一个文件没有任何变化。我会马上更新我的问题,我已经尝试了JFrame和JDialog,以及pdf、xlsx和zip——所有在java UI前面打开的外部应用程序。我在Ubuntu上。使用java.awt.Window中的方法toBack()怎么样(它在对话框中被覆盖)@Ivan Sopov,你能粘贴一段代码(作为答案)吗?您使用什么桌面环境?团结?我的应用程序的toBack()——这意味着每次启动文件时,我都必须将其放回所有其他窗口。等等,如果删除“dlg.toBack()”,您的计算机会发生什么情况?在我的例子中(使用KDE3.5.10),没有——正如我在OP中所描述的——现在两个窗口都支持IntelliJ IDEA。如果我删除“dlg.toBack()”,pdf查看器就会出现在前面。JDialog位于pdf viewer后面,如果我关闭/隐藏pdf viewer(如果我没有切换到其他窗口—Eclipse、文件浏览器等),对话框将获得焦点。与“dlg.toBack()”的唯一区别是,打开pdf viewer后,JDialog位于Eclipse后面。在我关闭pdf查看器后,它会回到前面。我仍然认为,如果您开发通用应用程序,最好在windows上进行测试。如果是在linux上内部使用的公司应用程序,我认为用户可以在后台打开文件;-)谢谢,所以最有可能的问题是“KDE中的Swing”。遗憾:-(
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);
        }
    });
}
}