4

在 Java 中,我使用此 stackoverflow 问题中描述的方法打开一个带有默认文件处理程序(MS Excel,在本例中为 :-) 的 Excel 文件:

Desktop dt = Desktop.getDesktop();
dt.open(new File(filename));

但是,Excel 程序没有得到关注。有什么简单的方法可以做到这一点?

编辑:C#有一个相关的stackoverflow问题,但我没有找到任何类似的Java方法。

编辑2:我做了一些简单的测试,发现只要没有运行Excel实例,Excel就会启动并获得焦点。当 Excel 已打开且未最小化时,应用程序不会获得焦点。如果相反,Excel 窗口被最小化,上面的代码将触发窗口最大化并且 Excel 获得焦点(反之亦然:-))。

4

2 回答 2

1

如果您只关心 Windows(在问题中暗示),您可以更改调用 Excel 的方式:使用“cmd start...”。

一段时间以来,我一直在使用这段代码来启动 Windows 应用程序。每次都有效。它依赖于 Windows 中的文件关联来查找应用程序。启动的应用程序成为桌面上的焦点窗口。

在您的情况下,Excel 应该与 .xls、.csv 和其他典型扩展名相关联。如果是,Windows 将启动 Excel,将您的文件传递给它。

用法:

MyUtilClass.startApplication( "c:\\mydir\\myfile.csv", "my window title" );

file是 Excel 输入文件的完整路径,title也是窗口标题(应用程序可能会也可能不会接受 - Excel 会更改窗口标题)。

public static void startApplication( String file, String title )
{
  try
  {
     Runtime.getRuntime().exec( new String[] { "cmd", "/c", "start", title, file } );
  }
  catch( Exception e )
  {
     System.out.println( e.getMessage() );
  }
}
于 2010-05-09T20:41:50.767 回答
0

从也运行在 JVM 中的 scala 程序中,我可以打开一个应用程序,默认情况下这是焦点。(用 xUbuntu 测试,这是一种 Linux)。

import java.awt.Desktop                
val dt = Desktop.getDesktop ();        
dt.open (new java.io.File ("euler166.svg"));

我不能说,这是否是特定于 Linux 的,或者可能是其他东西 - 但是在我的示例中启动 Inkscape,在您的示例中,可能需要几秒钟,而用户不耐烦地再次单击 javaprogram,从而收回光标. 你检查了吗?

然后,您可以更改到最后一个应用程序,至少在 Linux 和 Windows 上使用 ALT-Tab aka Meta-Tab(再次显示在 scala 代码中,您可以轻松地将其转换为 javacode,我敢肯定):

import java.awt.Robot
import java.awt.event._ 

val rob = new Robot ()
rob.keyPress (KeyEvent.VK_META)
rob.keyPress (KeyEvent.VK_TAB)
rob.keyRelease (KeyEvent.VK_TAB)
rob.keyRelease (KeyEvent.VK_META)

但不幸的是,未知来源关闭更麻烦,也称为用户,可能什么都不做,所以切换将是错误的事情。也许有一个线程,它检查一定时间的java程序是否有焦点,但它在交互环境中保持一种轮盘赌的形式,因为用户可能有一台快或慢的机器,或者更改为同时进行第三次申请,以此类推。也许在触发新应用程序之前的提示是你能做的最好的?

于 2010-05-07T18:22:11.153 回答