该代码主要是timeline和进度条使用
import javafx.animation.*;
import javafx.application.Application;
import javafx.beans.property.*;
import javafx.beans.value.*;
import javafx.event.*;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;
public class LabeledProgressBarSample extends Application {
public static void main(String[] args) { launch(args); }
@Override public void start(final Stage stage) {
stage.setScene(new Scene(createResettableProgressIndicatorBar()));
stage.show();
}
private VBox createResettableProgressIndicatorBar() {
final int TOTAL_WORK = 18;
final String WORK_DONE_LABEL_FORMAT = "%.0f";
final ReadOnlyDoubleWrapper workDone = new ReadOnlyDoubleWrapper();
final ProgressIndicatorBar bar = new ProgressIndicatorBar(
workDone.getReadOnlyProperty(),
TOTAL_WORK,
WORK_DONE_LABEL_FORMAT
);
final Timeline countDown = new Timeline(
new KeyFrame(Duration.seconds(0), new KeyValue(workDone, TOTAL_WORK)), //初始化workDone等于total,也就是进度条满的
new KeyFrame(Duration.seconds(10), new KeyValue(workDone, 0)) //10秒内把workDone减到0。
);
countDown.play();
final Button resetButton = new Button("Reset");
resetButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
countDown.playFromStart(); //重新开始
}
});
final VBox layout = new VBox(20);
layout.setAlignment(Pos.CENTER);
layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 20px;");
layout.getChildren().addAll(bar, resetButton);
return layout;
}
}
class ProgressIndicatorBar extends StackPane {
final private ReadOnlyDoubleProperty workDone;
final private double totalWork;
final private ProgressBar bar = new ProgressBar();
final private Text text = new Text();
final private String labelFormatSpecifier;
final private static int DEFAULT_LABEL_PADDING = 5;
ProgressIndicatorBar(final ReadOnlyDoubleProperty workDone, final double totalWork, final String labelFormatSpecifier) {
this.workDone = workDone;
this.totalWork = totalWork;
this.labelFormatSpecifier = labelFormatSpecifier;
syncProgress();
//监听workDone的变化,从而更新text和progress
workDone.addListener(new ChangeListener<Number>() {
@Override public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) {
syncProgress();
}
});
bar.setMaxWidth(Double.MAX_VALUE); // allows the progress bar to expand to fill available horizontal space.
getChildren().setAll(bar, text);
}
// synchronizes the progress indicated with the work done.
private void syncProgress() {
if (workDone == null || totalWork == 0) {
text.setText("");
bar.setProgress(ProgressBar.INDETERMINATE_PROGRESS);
} else {
text.setText(String.format(labelFormatSpecifier, Math.ceil(workDone.get()))); //更新text
bar.setProgress(workDone.get() / totalWork); //更新进度条
}
bar.setMinHeight(text.getBoundsInLocal().getHeight() + DEFAULT_LABEL_PADDING * 2);
bar.setMinWidth (text.getBoundsInLocal().getWidth() + DEFAULT_LABEL_PADDING * 2);
}
}
代码主要也就是timeline和progress二个的用法。fx最好的就是多了property,property里面多了方法。如上面的ReadOnlyDoubleWrapper,可以监控其值得变化。
String.format(labelFormatSpecifier, Math.ceil(workDone.get()));学习到了一个格式转化。
分享到:
相关推荐
NULL 博文链接:https://lujin55.iteye.com/blog/1811244
JavaFX学习资料总结
javaFx 学习--之布局菜单
最新的javaFX学习资料,相信javaFX必定成为主流。
javafx学习网站
JavaFX教程;JavaFX教程;JavaFX教程JavaFX教程;
JavaFX 8: Introduction by Example书的示例代码JavaFX 8: Introduction by Example
JavaFX学习曲线日记
javaFx 学习--之Adding Dynamic Behavior(加动态特性源码)
NULL 博文链接:https://lujin55.iteye.com/blog/1709828
javaFx 学习--之组件篇1(边框与布局管理1Label)
javaFx 学习--入门示例程序的源码
javafx语言中文教程,内附代码,有助于学习理解!
JavaFx 的官方入门教材,英文
javafx菜单之多级菜单1
学习JavaFX脚本语言
javafx学习资料,包括数据类型、操作符、函数等。
JavaFX+Jfoenix 学习笔记(一)--环境搭建及多款Hello World演示的源码 JavaFX的简单展示,主要是为了配合文章学习使用
javafx
该产品于2007年5月在JavaOne大会上首次对外公布。JavaFX技术主要应用于创建Rich Internet Applications(RIAs)。当前的JavaFX包括JavaFX脚本和JavaFX Mobile(一种运营于行动装置的操作系统),今后JavaFX将包括更...