2011-08-02 56 views
5

我已經搜索所有網站上也沒有找到這個問題的答案:調試閃屏從Eclipse中,而不會產生罐

我需要調試改變基於你在模塊上的閃屏的應用程序的功能訪問。

我知道代碼:

SplashScreen splash = SplashScreen.getSplashScreen(); 

可以用來當你通過得到的實例之一:

  • 從命令行飛濺:JAVA -splash:路徑/ Image.gif的ClassFile的
  • 飛濺圖像清單中:濺射屏幕圖像:IMG/SplashNomina.gif

靜止當我試圖通過在Eclipse中傳遞來自VM args的-splash值來運行應用程序時,它不起作用。

它實際上可能是因爲SplashScreen.getSplashScreen()始終爲NULL。 我一直在試圖傳球沒有成功:

  • -splash:Image.gif的
  • -Dsplash = Image.gif的

現在我看到很多侷限在這個飛濺API,因爲它總是需要傳遞參數。我認爲這將是更加靈活,能夠只是傳遞參數在運行時:(

任何幫助woult非常感激!

+0

有你在_run Configuration_試圖_VM Arguments_? – trashgod

+0

是的,我試過從那裏傳遞參數。看來問題在於-splash:image參數依賴於位於同一個目錄下的文件,我試圖將該圖像包含在Jar文件中。 – will824

+0

對不起,我誤讀了。您也可以嘗試此[實用程序](http://sites.google.com/site/drjohnbmatthews/manifesto)來驗證「SplashScreen-Image」屬性。 – trashgod

回答

11

OK,這咬我。

我建了一個可運行的jar 與清單項

SplashScreen-Image: MyGraphic.jpg 

和它的作品,因爲它是應該。

在Eclipse中,指定VM ARG作爲

-splash:MyGraphic.jpg 

沒有這樣的運氣

SplashScreen.getSplashScreen()返回null。

原因是JDK中的SplashScreen.getSplashScreen()至少是1.6的死腦實現。我認爲。如果沒有深入瞭解本機代碼的功能,很難分辨出來。但是,這裏是來自java.awt.SplashScreen的這個方法。我不知道這是否就是所謂的,但研究它沒有向我提供了重要的線索,我需要在Eclipse中得到這個工作:

public synchronized URL getImageURL() throws IllegalStateException { 
    checkVisible(); 
    if (imageURL == null) { 
     try { 
      String fileName = _getImageFileName(splashPtr); 
      String jarName = _getImageJarName(splashPtr); 
      if (fileName != null) { 
       if (jarName != null) { 
        imageURL = new URL("jar:"+(new File(jarName).toURL().toString())+"!/"+fileName); 
       } else { 
        imageURL = new File(fileName).toURL(); 
       } 
      } 
     } 
     catch(java.net.MalformedURLException e) { 
      // we'll just return null in this case 
     } 
    } 
    return imageURL; 
} 

注意,在文件的情況下(即命令行,而不是罐子啓動)它沒有執行getResource()來獲取URL,而是打開一個相對於CWD的文件。由於Eclipse運行配置默認從項目的根目錄運行,因此答案是將路徑指定爲相對路徑,而不是期望類路徑查找。

因此,由於我使用maven構建,因此我的映像位於src/main/resources/MyGraphic.jpg。指定此作爲命令行參數:即

-splash:src/main/resources/MyGraphic.jpg 

允許它在Eclipse中工作(或者,我想,任何命令行)

我不知道這是爲什麼,因爲getImageURL方法不被getSplashScreen()調用,但它工作。

對我來說,這是Sun/Oracle部分的大腦死亡。他們可以很容易地做一個類似於 的類路徑查找imageURL = getResource(filename),但他們沒有。

簡短的回答是,啓動畫面命令行語法引用的是相對於當前工作目錄的文件名,而不是相對於類路徑。

+0

關於此的很好的分析。謝謝你的努力來解釋這個問題,如果沒有你的答案,仍然會在黑暗中。 :) – will824

3

好球員,我決定去喲我獨立的方式,因爲飛濺類過於單一,所以在這裏我把我的課:

import java.awt.EventQueue; 
import java.awt.Frame; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.Toolkit; 
import java.net.URL; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 


public class SplashWindow extends JFrame { 

    private static final long serialVersionUID = 9090438525613758648L; 

    private static SplashWindow instance; 

    private boolean paintCalled = false; 

    private Image image; 

    private SplashWindow(Image image) { 
    super(); 
    this.image = image; 
    JLabel label = new JLabel(); 
    label.setIcon(new ImageIcon(image)); 
    this.add(label);  
    this.setUndecorated(true); 
    this.setAlwaysOnTop(true); 
    this.pack(); 
    this.setLocationRelativeTo(null); 

    } 

    public static void splash(URL imageURL) { 
    if (imageURL != null) { 
     splash(Toolkit.getDefaultToolkit().createImage(imageURL)); 
    } 
    } 

    public static void splash(Image image) { 
    if (instance == null && image != null) { 
     instance = new SplashWindow(image); 
     instance.setVisible(true); 

     if (!EventQueue.isDispatchThread() && Runtime.getRuntime().availableProcessors() == 1) { 

     synchronized (instance) { 
      while (!instance.paintCalled) { 
      try { 
       instance.wait(); 
      } catch (InterruptedException e) { 
      } 
      } 
     } 
     } 
    } 
    } 

    @Override 
    public void update(Graphics g) { 
    paint(g); 
    } 

    @Override 
    public void paint(Graphics g) { 
    g.drawImage(image, 0, 0, this); 
    if (!paintCalled) { 
     paintCalled = true; 
     synchronized (this) { 
     notifyAll(); 
     } 
    } 
    } 

    public static void disposeSplash() { 
    instance.setVisible(false); 
    instance.dispose(); 
    } 
} 

希望它可以幫助別人;)

3

我回答3年後,但我有同樣的問題,我試圖解決。 我找到了解決方案,我認爲這對每個人都有用。

你必須創建啓動配置,指定在VM參數參數-splash:Image.gif的。該參數指向項目的根目錄(不是/ bin或/ src)。所以你必須把你的映像放在與/ bin和/ src相同的級別(或者你可以在-splash選項中指定一個不同的路徑)。

當您從'export'中導出可運行JAR並指定之前創建的啓動配置時,它會顯示'不能包含VM參數,您必須從命令行指定'(並且不包含您的映像。在根中的gif)。 所以,如果你想有一個可運行的jar與你的飛濺圖像,你可以參考另一個主題stackoverflow,我不再找到了。有人回答說最好的解決方案是FatJar。您可以按照以下步驟進行操作:export> other> fat jar exporter。勾選'選擇清單文件',指定包含'SplashScreen-Image:splash.gif'的MANIFEST.MF(如果您不知道如何創建,請取消選擇此複選框,使用默認值創建一個jar,修改創建的jar文件幷包括它)。在導出的下一頁中,確保將圖像包含在jar中,並帶有'add dir'按鈕(它包括指定到項目根目錄的目錄內容,因此請注意清單中的目錄)。 它爲我工作。

所以如果你想用eclipse運行,將splash圖像添加到根目錄並在VM參數中指定-splash:image.gif。如果你想導出一個JAR,FatJar插件就像我指定的那樣爲我工作。

我希望它能幫助:)

(我的英語對不起,我不是英語:P)

+1

非常感謝您的回答,如果這是3年前的問題,這並不重要,因爲有些人現在可能會遇到這個問題,您的貢獻非常寶貴! :) – will824