2011-08-02 24 views
5

mam szukać w całym internecie, ale nie mógł znaleźć odpowiedź na to pytanie:Debug ekran powitalny z Eclipse bez generowania Jar

muszę debugowania funkcjonowania aplikacji, która zmienia ekran powitalny opartego na module jesteś dostęp.

wiem, że kod:

SplashScreen splash = SplashScreen.getSplashScreen(); 

Może być stosowany w celu uzyskania instancji kiedy przechodzą albo:

  • Splash z linii komend: java -splash: ścieżka/image.gif ClassFile
  • Splash obraz w manifeście: ekran powitalny-image: img/SplashNomina.gif

Still kiedy próbowałem uruchomić aplikację, przekazując wartość -splash z argumentów VM w Eclipse, to nie działało.

Czy to rzeczywiście możliwe, ponieważ SplashScreen.getSplashScreen() ma zawsze wartość NULL. staram przechodząc bez powodzenia:

  • -splash: image.gif
  • -Dsplash = image.gif

Teraz widzę wiele ograniczeń w tym Splash api, jak to zawsze wymaga podania parametru. Myślę, że byłoby znacznie bardziej elastyczne, aby móc po prostu przekazać parametr przy starcie :(

Każda pomoc woult być naprawdę doceniane!

+0

Czy próbowałeś _VM Arguments_ w _Run Configuration_? – trashgod

+0

Tak, próbowałem faktycznie przekazać argumenty z tego miejsca. Wygląda na to, że problem polega na tym, że argument -splash: image opiera się na pliku znajdującym się w tym samym katalogu i próbuję dołączyć obraz do pliku Jar. – will824

+0

Przepraszam, źle odczytałem. Możesz również wypróbować ten [narzędzie] (http://sites.google.com/site/drjohnbmatthews/manifesto), aby zweryfikować atrybut "SplashScreen-Image" _in situ_. – trashgod

Odpowiedz

11

OK, to ugryzł mnie też.

Zbudowałem runnable słoik z oczywistego wpisu

SplashScreen-Image: MyGraphic.jpg 

i działa jak to miało.

Od Eclipse, określając VM arg jako

-splash:MyGraphic.jpg 

ma takiego szczęścia

SplashScreen.getSplashScreen() zwraca wartość null.

Powodem tego jest nieumeblowana implementacja SplashScreen.getSplashScreen() w JDK (przynajmniej 1.6). Myślę. Trudno powiedzieć, nie wchodząc w to, co robi natywny kod. Ale tutaj jest ta metoda z java.awt.SplashScreen.Nie jestem pewien, czy to się nazywa, ale studia to nie zapewni mi zasadniczego pojęcia, że ​​muszę dostać tej pracy w 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; 
} 

pamiętać, że w przypadku pliku (tj wiersza polecenia zamiast słoik uruchom) nie robi getResource(), aby uzyskać adres URL, ale otwiera plik w stosunku do CWD. Ponieważ konfiguracje Eclipse uruchamiają się domyślnie z katalogu głównego projektu, odpowiedzią jest określenie ścieżki jako ścieżki względnej, a nie oczekiwanie na wyszukiwanie w klasie classpath.

Dlatego, ponieważ buduję z maven, mój obraz znajduje się w src/main/resources/MyGraphic.jpg. Określając to jako parametr wiersza poleceń: tj

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

pozwala mu pracować w Eclipse (lub, jak sądzę, każdy wiersz poleceń)

Nie jestem pewien, dlaczego tak jest, ponieważ metoda jest getImageURL NIE wywoływane przez getSplashScreen(), ale działa.

Dla mnie jest to rodzaj martwego mózgu ze strony Słońca/Wyroczni. Mogli łatwo wykonać wyszukiwanie ścieżki klasy z czymś podobnym do imageURL = getResource (nazwa pliku), ale nie zrobili tego.

Krótka odpowiedź brzmi, że składnia wiersza poleceń ekranu powitalnego odnosi się do nazwy pliku w stosunku do bieżącej pozycji roboczej, a nie do ścieżki klasy.

+0

Świetna analiza na ten temat. Dziękuję za wysiłek, aby wyjaśnić tę kwestię, wciąż bez odpowiedzi. :) – will824

3

Well facetów, postanowiłem yo iść moją niezależną drogę, ponieważ klasa Splash jest zbyt monolityczne, więc o kładę klasa:

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(); 
    } 
} 

nadzieję, że ktoś pomoże;)

3

Odpowiadam 3 lata później, ale miałem ten sam problem i próbowałem rozwiązać. Znalazłem rozwiązanie i myślę, że przyda się ono każdemu.

Musisz utworzyć konfigurację uruchamiania, określając w argumenty VM parametrze -splash: image.gif. Ten parametr odnosi się do katalogu głównego projektu (nie/bin lub/src). Musisz umieścić obraz na tym samym poziomie, co/bin i/src (lub możesz określić inną ścieżkę w opcji -splash).

Po wyeksportowaniu działającego pliku JAR z "eksportu" określającego konfigurację uruchamiania utworzoną wcześniej, oznacza to, że "nie może zawierać argumentów maszyny wirtualnej, należy określić z wiersza polecenia" (i nie zawiera obrazu. gif w root). Więc jeśli chcesz mieć działający słoik z obrazem powitalnym, możesz odwołać się do innego tematu na stackoverflow, którego już nie znajduję. Ktoś odpowiedział, że najlepszym rozwiązaniem jest FatJar. Możesz postępować w następujący sposób: eksport> inny> eksporter słoików. Zaznacz "wybierz plik manifestu", określając MANIFEST.MF zawierający "SplashScreen-Image: splash.gif" (jeśli nie wiesz, jak utworzyć, odznacz to pole wyboru, utwórz słoik z domyślnym, zmodyfikuj ten utworzony i włącz to). Na następnej stronie wywozu umieść swoje obrazy w słoiku za pomocą przycisku "dodaj katalog" (zawiera on zawartość katalogu określonego w katalogu głównym projektu, więc zwróć uwagę na katalog w manifeście). To zadziałało dla mnie.

Jeśli chcesz uruchomić środowisko Eclipse, dodaj obraz powitalny do katalogu głównego i podaj parametr -splash: image.gif w argumentach VM. Jeśli chcesz wyeksportować plik JAR, wtyczka FatJar działała dla mnie tak, jak to określiłem.

Mam nadzieję, że to pomaga :)

(Przepraszam za mój angielski, nie jestem po angielsku: P)

+1

Wielkie dzięki za odpowiedź, nie ma znaczenia, czy było to 3-letnie pytanie, ponieważ niektórzy ludzie mogą mieć ten problem właśnie teraz, a twój wkład jest bardzo cenny !! :) – will824

Powiązane problemy