2011-01-19 75 views
1

在Windows上,我使用Exe4J啓動我的Java應用程序。這具有以下優點:Linux - 用於Java應用程序的啓動畫面

  • 閃屏,顯示的Java開始
  • 可能性之前更新啓動時閃屏上的標籤,直到應用程序愚蠢加載(「初始化通量補償」,「記錄高半字節「等)

現在我想在Linux上實現這一點。我用一個Shell腳本啓動我的應用程序,但會喜歡一種簡單的方式來顯示某種帶有標籤的啓動GUI,我可以在啓動過程中從shell腳本更新它。

有沒有一種簡單的方法來從shell腳本啓動一個最小的GUI,並從shell腳本中更新其中的標籤,而無需爲它編譯單獨的可執行文件(甚至可能是Mac OS X )?

PS:我不想在啓動畫面中使用Java版本,因爲標籤必須動態更新。

回答

3

對屏幕飛濺標準Java 1.6+解決方案並支持自定義的飛濺Screensplash Tutorial繪圖。

下面是一個飛濺控制器的例子,它有一個主要方法 - 用splash參數運行它來查看結果。

package somepackage; 
import java.awt.AlphaComposite; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FontMetrics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.SplashScreen; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.Rectangle2D; 

public class SplashController implements ActionListener { 
    private static final int X = 20, W = 300; 
    private static final int TEXT_H = 10, BAR_H = 10; 

    private int textY, barY; 
    private int barPos = 0; 

    private final SplashScreen splash; 
    private Graphics2D graph; 

    public SplashController(final int msgXOffset, final int msgYOffset) { 
    splash = SplashScreen.getSplashScreen(); 
    if (splash == null) { 
     System.out.println("Error: no splash image specified on the command line"); 
     return; 
    } 

    // compute base positions for text and progress bar 
    final Dimension splashSize = splash.getSize(); 
    textY = splashSize.height - msgYOffset; 
    barY = splashSize.height - msgYOffset; 

    graph = splash.createGraphics(); 
    //timer.start(); 
} 

public SplashController() { 
    this(30, 30); 
} 

@Override 
public void actionPerformed(final ActionEvent e) { 
    drawSplashProgress(msg); 
} 

public void closeSplash() { 
    if (splash != null) { 
     splash.close(); 
    } 
} 

private String msg; 

public void drawSplashProgress(final String msg) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      SplashController.this.msg = msg; 
      graph.setRenderingHint(RenderingHints.KEY_INTERPOLATION,        RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
      graph.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      graph.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
      graph.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); 

      // clear what we don't need from previous state 
      graph.setComposite(AlphaComposite.Clear); 

      final FontMetrics fm = graph.getFontMetrics(); 
      final Rectangle2D textsize = fm.getStringBounds(msg, graph); 

      graph.fillRect(X, textY - 1, W, (int) textsize.getHeight() + 5); 
      if (barPos == 0) { 
       graph.fillRect(X - 3, barY, W + 10, BAR_H); 
      } 

      // draw new state 
      graph.setPaintMode(); 

      // draw message 
      graph.setColor(Color.BLACK); 
      graph.drawString(msg, X, textY + TEXT_H); 
      try { 
       splash.update(); 
      } catch (final IllegalStateException e) { 
       // can be ignored 
      } 
     } 
    }); 
} 

public static void main(final String args[]) throws Exception { 
    final SplashController test = new SplashController(); 
    for (int i = 0; i < 50; i++) { 
     test.drawSplashProgress("Progress step number " + i); 
     Thread.sleep(250); 
    } 
    test.closeSplash(); 
} 
} 
+0

+1哦,我還不知道這個解決方案。可以真正解決我的問題。我會調查...... – Daniel 2011-01-19 10:41:34

1

Eclipse啓動器支持所有平臺上的這個功能,但移動到SWT可能會太過分?有詳細信息here

+0

無論如何,我使用SWT,所以這將是沒有問題的!我不知道我可以配置Eclipse啓動器來做到這一點! – Daniel 2011-01-19 09:03:50

0

您可以使用腳本中的Python(或其他一些公開GUI功能的腳本語言)。

http://docs.python.org/faq/gui.html

+0

okey,但我不想爲此學習Python或TCL或任何新語言,而且我也不想爲我的程序添加python依賴項。 – Daniel 2011-01-19 09:09:28

相關問題