我想设计一个可以通过进度条显示当前加载过程的启动画面, 很像netbeans启动屏幕,因为它显示
loading... modules, done!.... loading modules and so on
加载完成后,主应用程序出现了。
我读过许多与仅创建启动画面有关的文章,但没有一篇文章涉及如何在启动画面上显示不同后台任务的进度。
我怎样才能做到这一点?
我可以将javafx 2用于启动画面,而应用程序的其余部分使用java编写
解决!
我终于成功了。 我的错误是我正在更新任务线程中的GUI内容,因此我的任务线程被阻止,并且在GUI更新指令后无法执行下一条指令。现在我在任务完成后移动了那些更新GUI指令,和它的工作...... 感谢Jewelsea的正确道路。
答案 0 :(得分:9)
我之前为独立的JavaFX 2.0应用程序创建了splash page sample。
我更新了示例,以通过启动页面上的进度条和进度文本演示对加载进度的监控。
要调整代码以监视应用程序的初始化进度,而不是将ProgressBar
绑定到WebEngine的loadWorker.workDone
属性,请创建执行昂贵的初始化工作的JavaFX Task,以及通过任务的progressProperty和messageProperty监控Task
的进度。
以下是基于前一段中概述的任务方法的splash based sample链接。
对于WebStart或浏览器嵌入式JavaFX应用程序,请使用assylias建议的preloader。
答案 1 :(得分:4)
如果您使用java-web-start进行部署,则icon
element可以引用各种图片。进度指示由jnlp
客户端在下载期间处理。优点是很早就在用户体验中进行干预。
稍后,SwingWorker
可以在后台加载图片,如图here所示。工作人员的progress()
方法可以通过JProgressBar
推送PropertyChangeListener
,如图here所示。
答案 2 :(得分:3)
使用preloader显示应用程序初始化的进度似乎正是您要找的。 p>
答案 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屏幕组件。