2010-05-04 28 views
4

從Java內部,我使用在this stackoverflow question描述的方法打開的Excel與默認文件處理程序(MS Excel中,在這種情況下:-))文件:如何將焦點集中到來自Java的shell打開文件的默認程序?

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

然而,Excel程序不得到重點。有沒有簡單的方法可以做到這一點?

編輯:有一個related stackoverflow question for C#,但我沒有找到任何類似的Java方法。

編輯2:我做了一些簡單的測試,並發現Excel啓動並獲取焦點,每當沒有Excel實例運行。當Excel已經打開並且不被最小化時,應用程序不會獲得焦點。如果Excel窗口被最小化,上面的代碼將觸發窗口的最大化並且Excel獲得焦點(反之亦然:-))。

回答

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鍵又名元標籤(在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程序是否有焦點,但它保持一種輪盤賭,在交互環境中,因爲用戶可能有一個快或慢的機器,或更改爲第三個應用程序,等等。也許在觸發新應用程序之前提示是最好的選擇?

+0

感謝您的回答。我是唯一的用戶(目前),所以我可以確認這不是點擊次數過多的問題。事實上,我注意到有時候Excel會得到關注,但大部分情況並非如此。 BTW Excel通常已經打開,這可能是他問題的根源...... – Rabarberski 2010-05-08 10:13:39

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()); 
    } 
} 
相關問題