这是一个示例,希望对您有所帮助。你可以做的一件事是使用Task
加载所有数据。当。。。的时候Task
完成了,使用来自的想法将 MVC 与 JavaFX 一起应用 https://stackoverflow.com/questions/32342864/applying-mvc-with-javafx通过Model
to any Controller
需要它。
Main
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();
}
}
主控制器/启动画面
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;
}
}
主要FXML
<?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>
Model
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.";
}
}