2011-01-19 23 views
1

Windowsでは、Exe4Jを使用してJavaアプリケーションを起動します。これは、次のような利点があります:Javaは起動時にスプラッシュ画面上のラベルを更新する Linux - Javaアプリケーションのスプラッシュ画面

  • 可能性を開始する前に、アプリケーションが愚か高並べ替え」、「初期化フラックス補償器」(ロードされるまで、表示さ

    • スプラッシュスクリーンニブル」など)

    これをLinuxで実装したいと考えています。私はシェルスクリプトを使ってアプリケーションを起動しますが、スタートアップ時にシェルスクリプトから更新できるラベルが付いたスプラッシュGUIを表示する簡単な方法が好きです。

    シェルスクリプトから最小限のGUIを起動し、シェルスクリプトからラベルを更新する簡単な方法はありますか?linux(Mac OS X )?

    PS:動的に更新する必要があるラベルがあるため、スプラッシュ画面でJavaビルドを使用したくありません。

  • 答えて

    3

    画面のスプラッシュのための標準のJava 1.6+ソリューションは、カスタムスプラッシュScreensplash Tutorial上の描画をサポートしています。

    ここに、スプラッシュコントローラの例があります。メインコントローラにはスプラッシュパラメータを指定して実行し、結果を確認します。

    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

    1

    Eclipseランチャーはこの機能をすべてのプラットフォームでサポートしていますが、SWTへの移行は行き過ぎになる可能性がありますか?詳細はhereです。

    +0

    私はSWTを使用していますので、問題ありません。私はEclipseランチャーがこれを正確に行うように設定できるかどうかはわかりませんでした。 – Daniel

    0

    スクリプトからPython(またはGUI機能を公開する他のスクリプト言語)を使用できます。

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

    +0

    okeyですが、私はPythonやTCL、あるいはこれのための新しい言語を学びたくないので、私のプログラムにもPythonの依存関係を追加したくありません。 – Daniel

    関連する問題