启动与给定文件关联的file = launch程序,并在程序启动时自动打开该文件。
假设我运行IntelliJ IDEA,运行我的代码并显示程序的主窗口(模态)。我的程序在前台。
然后我从我的程序中启动一个.pdf文件(现在它意味着将执行AcroReader)。 AA将出现在IntelliJ面前但是在我的程序之后。
我希望在我的节目面前展示AA(当然这只是一个例子),而不是落后。怎么做?
请注意,这并不意味着我想将我的程序移到后台!
对于启动文件,我使用
java.awt.Desktop.getDesktop().open(new java.io.File(filepath));
我的GUI在Swing中完成。
为了排除自定义小部件,事件等的任何影响,我只将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的左上角靠近我的应用程序的右下角。
答案 0 :(得分:1)
您可以尝试这样的事情。在我的机器上(Ubuntu 10.4 LTS与Gnome2)它在前面给出了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);
}
});
}
}