设计启动画面(java)

时间:2012-04-03 16:29:05

标签: java swing splash-screen javafx-2

我想设计一个可以通过进度条显示当前加载过程的启动画面, 很像netbeans启动屏幕,因为它显示

loading... modules, done!.... loading modules and so on 

加载完成后,主应用程序出现了。

我读过许多与仅创建启动画面有关的文章,但没有一篇文章涉及如何在启动画面上显示不同后台任务的进度。

我怎样才能做到这一点?

我可以将javafx 2用于启动画面,而应用程序的其余部分使用java编写

解决!

我终于成功了。 我的错误是我正在更新任务线程中的GUI内容,因此我的任务线程被阻止,并且在GUI更新指令后无法执行下一条指令。现在我在任务完成后移动了那些更新GUI指令,和它的工作...... 感谢Jewelsea的正确道路。

6 个答案:

答案 0 :(得分:9)

我之前为独立的JavaFX 2.0应用程序创建了splash page sample

我更新了示例,以通过启动页面上的进度条和进度文本演示对加载进度的监控。

要调整代码以监视应用程序的初始化进度,而不是将ProgressBar绑定到WebEngine的loadWorker.workDone属性,请创建执行昂贵的初始化工作的JavaFX Task,以及通过任务的progressPropertymessageProperty监控Task的进度。

以下是基于前一段中概述的任务方法的splash based sample链接。

对于WebStart或浏览器嵌入式JavaFX应用程序,请使用assylias建议的preloader

答案 1 :(得分:4)

如果您使用进行部署,则icon element可以引用各种图片。进度指示由jnlp客户端在下载期间处理。优点是很早就在用户体验中进行干预。

稍后,SwingWorker可以在后台加载图片,如图here所示。工作人员的progress()方法可以通过JProgressBar推送PropertyChangeListener,如图here所示。

答案 2 :(得分:3)

使用preloader显示应用程序初始化的进度似乎正是您要找的。

答案 3 :(得分:3)

查看Swing splash-screen tutorial,其中包含在初始屏幕上更新进度条的示例。您可以轻松调整样本以更新某些文本。

答案 4 :(得分:0)

为完整起见,如果要显示进度条。引用SplashScreen javadoc

  

启动屏幕窗口会在第一个窗口自动关闭   窗口由Swing / AWT显示。

这意味着它不能使用标准的AWT / Swing组件(例如JProgressBar),但只能通过Graphics2D方法(例如drawText()fillRect(),...来绘制。 ..)。

所以你必须在一个单独的类中模拟一个进度条(代码是一个非常粗略的演示。你应该检查SplashScreen.isVisible()):

public class SplashProgressBar {

    SplashScreen splash;
    Graphics2D g;
    int x, y, w, h; // Drawing position in splash screen

    int val, max; // Progress bar value
    String text; // Text to display

    public SplashProgressBar(SplashScreen splash, int x, int y, int w, int h) {
        this.splash = splash;
        g = splash.createGraphics();
        this.x = x;
        // this.y = y; etc
        this.val = 0;
        this.max = 100;
    }

    public void setMaximum(int n) {
        max = n;
        update();
    }

    public void setValue(int n) {
        val = n;
        update();
    }

    public void setString(String text) {
        this.text = text;
        update();
    }

    public void update() {
        g.setColor(Color.WHITE);
        g.fillRect(x, y, w, h);
        g.setColor(Color.DARK_GRAY);
        g.drawRect(x, y, w, h);
        g.setColor(Color.ORANGE);
        g.fill3DRect(x, y, w * val / max, h, true);
        if (text != null) {
            g.setColor(Color.BLACK);
            g.drawString(text, x + (w - g.getFontMetrics().stringWidth(text)) / 2.0f, y + 8 - 2); // Use TextLayout to get precise text dimensions...
        }
        splash.update();
    }
}

然后:

// Drawn a scroll bar at (10;100) x (300x15) on the splash screen image (we know its size and where it would fit)
SplashProgressBar spb = new SplashProgressBar(SplashScreen.getSplashScreen(), 10, 100, 300, 15);
spb.setMaximum(processing.size());
for (int i = 0; i < processing.size(); i++) {
    spb.setValue(i);
    spb.setString("Processing #"+(i+1));
    // Do the processing...
}

答案 5 :(得分:-1)

您还可以使用java创建启动画面

但是如果你想编写更少的代码并且不仅仅使用JavaFx Splash屏幕组件。