- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个 JavaFX 应用程序,该应用程序需要在启动主应用程序阶段之前从文件中加载资源。我完成此任务的解决方案是使用 PreLoader,以便用户在加载资源之前无法与应用程序交互(非常标准的东西)。
我有一个扩展 PreLoader 类的类,该类创建一个加载 .fxml 文件的对象,该文件是 PreLoader 场景将显示的内容。它工作得很好,直到我尝试插入代码来加载文件。
我想同时执行此操作,以便在加载文件期间状态会更新到屏幕上。我已经研究过使用此处的任务和论坛,但没有任何帮助,因为我不知道将代码放在哪里。
扩展预加载器的类:
public class SplashPreLoader extends Preloader {
private Stage stage;
private SplashScene loadScreen;
public void start(Stage stage) throws Exception {
SplashScene intro = new SplashScene();
this.loadScreen = intro;
this.stage = stage;
stage.setScene(new Scene(intro, 475, 425));
stage.initStyle(StageStyle.UNDECORATED);
stage.show();
}
@Override
public void handleProgressNotification(ProgressNotification pn) {
//bar.setProgress(pn.getProgress());
}
@Override
public void handleStateChangeNotification(StateChangeNotification evt) {
if (evt.getType() == StateChangeNotification.Type.BEFORE_LOAD) {
//loadScreen.setStatusMessage("Hello Mister");
}
if (evt.getType() == StateChangeNotification.Type.BEFORE_START) {
/* Task<Void> task = new Task<Void>() {
@Override
public Void call() {
updateMessage("this mesashlkjfhkjlsd");
return null ;
}
};
statusMessage.textProperty().bind(task.messageProperty());
task.messageProperty().addListener((obs, oldMessage, newMessage) -> loadScreen.setStatusMessage(newMessage));
Thread th = new Thread(task);
th.setDaemon(true);
th.start();*/
//loadScreen.loadWebDriver();
stage.hide();
}
}
场景组件:
public class SplashScene extends StackPane {
@FXML public Label statusMessage;
public SplashScene() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("splash_scene.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
//statusMessage.setTextFill(Color.WHITE);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
public String getStatusMessage() { return statusMessageProperty().getValue(); }
public void setStatusMessage(String value) {
statusMessageProperty().set(value);
System.out.println("at hert");
}
public StringProperty statusMessageProperty() { return statusMessage.textProperty(); }
public void loadWebDriver() {
//This is the function that I want to call to load all the files.
}
statusMessage
是我要在加载文件时修改的标签。我尝试将任务(线程)放在 loadWebDriver()
函数中、start()
末尾以及前面的 if 子句中,但它没有产生我想要的结果。
我也觉得很奇怪,因为当我在没有 task
的情况下尝试此操作时,我在文件加载代码之前有标签更改代码,但它们总是以相反的顺序执行。
我觉得这可以从文档中得到帮助,但对我来说没有任何意义..有人知道这意味着什么吗?
请注意,预加载器与其他 JavaFX 应用程序(包括 FX 线程)遵循相同的规则规则。特别是,类构造函数和 init() 方法将在非 FX 线程上调用,并且 start() 将在 FX 应用程序线程上执行。这也意味着应用程序构造函数/init() 将与预加载器 start() 同时运行。
我需要使用 init() 方法吗?
最佳答案
这是一个示例,希望对您有所帮助。您可以做的一件事是使用 Task
加载所有数据。当Task
完成后,使用 Applying MVC with JavaFX 中的想法将Model
传递给任何需要它的Controller
。
主要
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
import javafx.concurrent.Task;
/**
* JavaFX App
*/
public class App extends Application {
@Override
public void start(Stage primaryStage) throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("primary.fxml"));
Parent root = loader.load();
PrimaryController primaryController = loader.getController();
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
final Task<DataModel> task = new Task<DataModel>(){
@Override
protected DataModel call() throws Exception
{
updateProgress(0, 3);
DataModel dataModel = new DataModel();
dataModel.loadListViewData();
Thread.sleep(2000);
updateProgress(1, 3);
dataModel.loadComoBoxData();
Thread.sleep(2000);
updateProgress(2, 3);
dataModel.loadTextAreaData();
Thread.sleep(2000);
updateProgress(3, 3);
Thread.sleep(1000);
return dataModel;
}
};
task.setOnSucceeded((event) -> {
try
{
FXMLLoader secondaryLoader = new FXMLLoader(getClass().getResource("secondary.fxml"));
Stage secondaryStage = new Stage();
Parent secondaryRoot = secondaryLoader.load();
SecondaryController secondaryController = secondaryLoader.getController();
secondaryController.initModel(task.getValue());
secondaryStage.setTitle("Scene One");
secondaryStage.setScene(new Scene(secondaryRoot, 500, 500));
secondaryStage.show();
primaryStage.close();
} catch (IOException e)
{
e.printStackTrace();
}
});
primaryController.getPBSplashValue().progressProperty().bind(task.progressProperty());
primaryController.getPISplash().progressProperty().bind(task.progressProperty());
new Thread(task).start();
}
public static void main(String[] args) {
launch();
}
}
主 Controller /启动画面
import javafx.fxml.FXML;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.ProgressIndicator;
public class PrimaryController
{
@FXML
ProgressBar pbSplash;
@FXML
ProgressIndicator piSplash;
public ProgressBar getPBSplashValue()
{
return pbSplash;
}
public ProgressIndicator getPISplash()
{
return piSplash;
}
}
PrimaryFXML
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.ProgressBar?>
<?import javafx.scene.control.ProgressIndicator?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sed.test.maventtestproject.PrimaryController">
<children>
<VBox maxHeight="-Infinity" maxWidth="-Infinity">
<children>
<ProgressBar fx:id="pbSplash" prefWidth="200.0" progress="0.0" />
<ProgressIndicator fx:id="piSplash" progress="0.0" />
</children>
</VBox>
</children>
</StackPane>
SecondayController/FirstSceneAfterSplashScreen
import javafx.fxml.FXML;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListView;
import javafx.scene.control.TextArea;
public class SecondaryController {
@FXML ListView<String> lvMain;
@FXML ComboBox<String> cbMain;
@FXML TextArea taMain;
private DataModel model ;
public void initModel(DataModel model) {
if (this.model != null) {
throw new IllegalStateException("Model can only be initialized once");
}
this.model = model ;
lvMain.setItems(this.model.getListViewData());
cbMain.setItems(this.model.getComboBoxData());
taMain.setText(this.model.getTextAreaData());
}
}
辅助FXML
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.VBox?>
<VBox alignment="CENTER" spacing="20.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sed.test.maventtestproject.SecondaryController">
<children>
<ListView fx:id="lvMain" prefHeight="200.0" prefWidth="200.0" />
<ComboBox fx:id="cbMain" prefWidth="150.0" />
<TextArea fx:id="taMain" prefHeight="200.0" prefWidth="200.0" wrapText="true" />
</children>
<padding>
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
</padding>
</VBox>
型号
import java.util.ArrayList;
import java.util.List;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
/**
*
* @author blj0011
*/
public class DataModel
{
private final ObservableList<String> listViewData = FXCollections.observableArrayList();
private final ObservableList<String> comboBoxwData = FXCollections.observableArrayList();
private final StringProperty textAreaDataProperty = new SimpleStringProperty();
public DataModel()
{
}
public void loadListViewData()
{
listViewData.addAll(retrieveListViewDataFromDB());
}
public ObservableList<String> getListViewData()
{
return listViewData;
}
public void loadComoBoxData()
{
comboBoxwData.addAll(retrieveComboBoxDataFromDB());
}
public ObservableList<String> getComboBoxData()
{
return comboBoxwData;
}
public void loadTextAreaData()
{
textAreaDataProperty.set(retrieveTextAreaDataFromDB());
}
public StringProperty getTextAreaDataProperty()
{
return textAreaDataProperty;
}
public String getTextAreaData()
{
return textAreaDataProperty.get();
}
//Private methods that fake retrieving data from the database.
private List<String> retrieveListViewDataFromDB()
{
List<String> dataFromDB = new ArrayList();
for(int i = 0; i < 1000; i++)
{
dataFromDB.add(Integer.toString(i));
}
return dataFromDB;
}
private List<String> retrieveComboBoxDataFromDB()
{
List<String> dataFromDB = new ArrayList();
dataFromDB.add("A");
dataFromDB.add("B");
dataFromDB.add("C");
dataFromDB.add("D");
dataFromDB.add("E");
dataFromDB.add("F");
return dataFromDB;
}
private String retrieveTextAreaDataFromDB()
{
return "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.";
}
}
关于java - PreLoader 的多线程 - JavaFX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59938519/
我遇到的“预加载”的唯一设置是“无” - 有哪些选择? 我有一部很长的电影,需要一段时间才能开始(我假设是因为大小),我希望能够让它更快地播放。我认为让视频在页面加载后立即开始加载会给观众一个更快的
我正在为 PWA 开发一个 gatsby 主题/启动器,但我似乎无法摆脱以下控制台警告: The resource https://davidde.github.io/gatsby-starter-s
我正在使用 使资源加载速度更快的技术,但我没有看到对页面加载时间的可衡量影响。我不确定这是因为资源实际上没有被预加载,还是因为其他原因。 如果我使用 Firefox 进行调试,如何在 Firefox
如何正确预加载谷歌字体,而不在控制台中发出警告? 这是我的代码: 我已经在预加载链接中添加了 crossorigin 属性,但警告仍然存在 最佳答案 只需将跨域属性添加到主样式表
我正在从头开始学习 webpack。我已经学会了如何将 javascript 文件与 require 链接起来。我正在捆绑和缩小我的 js 文件,我正在用 watch 监听变化。我正在设置加载程序以将
我的 Rails 3.2 应用程序使用两个不同的数据库。主操作系统是 MySQL,而其他操作系统是 sqlserver 数据库: development: adapter: mysql2
我的响应式 flexslider 插件有问题。除非您在实际幻灯片中有许多图像,否则该插件可以正常工作。加载行为是 Not Acceptable 。 我希望有人可以帮助我使用以下 flexslider
我正在尝试修改页面上的控件以减少 session 依赖性。我目前无法访问页面本身,只能访问主要由 DataGrid 组成的控件。我正在尝试在回发时检索 DataGrid 信息,以便我可以操作数据并重新
我发现该指令在 Controls.pas(以及其他单元)中声明,我很高兴知道它的含义。 {$C PRELOAD} 据我所知 $C 表示断言控制,但是 PRELOAD 关键字是什么?是不是类似于“在预加
为了在加载远程内容时提供适当的安全级别,声明必须分别启用和禁用BrowserWindow的contextIsolation和nodeIntegration选项。在这种情况下,Node/Electron
为什么 Gorm 中的 Preload 函数是一个“好的实践”,因为每次调用它时它都会检索给定表的所有记录(热切加载)? 我看到很多人在处理关系时将预加载视为一个很好的解决方案,但我不明白为什么。 最
我已经安装了webpack@2.1.0-beta.27。之前,我使用的是 webpack@2.1.0-beta.22。在我的配置文件中,我使用了 preLoaders 和 postLoaders: p
我有代码: jQuery(img).each(function() { jQuery(this).animate({opacity: 0}); jQuery(t
这是 JPA2 实体监听器注释: @PrePersist @PreRemove @PostPersist @PostRemove @PreUpdate @PostUpdate @PostLoad 但是
Android MapView.preLoad() 方法的真正作用是什么? “API 声明在 map 当前中心预加载图 block ”。这是什么意思,我能否以某种方式使用它来加快 map 在我的 Ma
我正在开发一个 JavaFX 应用程序,该应用程序需要在启动主应用程序阶段之前从文件中加载资源。我完成此任务的解决方案是使用 PreLoader,以便用户在加载资源之前无法与应用程序交互(非常标准的东
好的,首先,这是我的代码。 var loader = document.getElementById("loader"); window.addEventListener("loader", func
在 CSS 中,我为转换编写了一些肮脏的代码,它加载了 24 个不同的蒙版图像。第一次播放时,加载时有延迟,但如果我有一个 div“预加载”它,即在页面加载时播放它,它似乎被缓存了,因此不会再次延迟,
我正在为我的网站制作一个自定义预加载器。它在本地主机上运行良好,但在实时站点上,div 不显示动画,文本仅放置在站点底部。
我使用 CSS 创建了一个预加载器。我想在预加载器完成后在幻灯片放映中显示图像。预加载完成后,图像应该会平滑淡入。这是我的代码结构。 #container{
我是一名优秀的程序员,十分优秀!