我正在开发一个JavaFX(在带有SceneBuilder的JDK8上)项目,该项目应该与基于Spring-MVC的服务器连接,我想从服务器访问一些对象并显示它。我已经编写了Spring服务器来根据请求回放所需的对象,但是我对UI编程和JavaFX的不熟悉使它变得有点困难。
在FXML文件中,我已经添加了一个网格窗格,我想在那里显示对象。我很感激你们的任何帮助,让我们开始。我只有基本代码,但我在下面粘贴它:
Canvas.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
</GridPane>
CanvasModel类:
public class Canvas {
private int canvasid;
private final StringProperty canvasName;
private final StringProperty canvasTitle;
private final StringProperty canvasImage;
private byte[] canvasImageInBytes;
public Canvas(String canvasName, String canvasTitle, String canvasImage){
this.canvasName = new SimpleStringProperty(canvasName);
this.canvasTitle = new SimpleStringProperty(canvasTitle);
this.canvasImage = new SimpleStringProperty(canvasImage);
}
//Getters and setters ommitted
}
主要课程:
public class Main extends Application {
private Stage primaryStage;
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("../View/mainui.fxml"));
primaryStage.setTitle("CheckAPP");
primaryStage.setScene(new Scene(root, 300, 600));
primaryStage.setFullScreen(false);
primaryStage.setMaximized(false);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
public Stage getPrimaryStage() {
return this.primaryStage;
}
}
现在向下方发出请求:
http://localhost:8080/canvaslist
它将返回我想在GridPane中显示的java.util.List。图像采用String格式。我明白这不是一个常规问题,因为这不起作用,但我试图绕过我的头脑进行UI编程,我不知道还有什么要转向。非常感谢你的帮助。
答案 0 :(得分:5)
加上我的几美分来帮助你。
background thread
从服务中获取数据,因为可能需要一段时间才能获得响应。在JavaFX应用程序线程上执行它可能会导致不良用户体验。在这种情况下,Task
会对您有所帮助。object / collection of object
,您将用它来更新场景图上的元素。JavaFX Application Thread
是您可以访问live scene graph
元素的唯一主题,因此您无法在后台线程中直接使用它们(使用它们将导致 {{1} } )。您可以使用Platform.runLater
或调用保证在FX应用程序线程上更新状态的IllegalStateException
方法来更新JavaFX场景图上的数据,例如updateProgress(...)
,{{ 3}},updateMessage(...)
等。task
中构建的object / collection of object
来创建(或更新)FX场景图元素。Step-2
作为其内容的控件(如TableView或ListView),你可以绑定内容和ObservableList
之一&# 39; s属性,根据其使用情况在执行期间/之后自动更新它们。Task
,因此我们可能需要更进一步并编写逻辑来创建控件并将其添加到GridPane
。我创建了一个使用服务的示例,解析JSON数据并从中创建GridPane
。 JSON有GridPane
的名字,他们喜欢的(根据我)和SO上的个人资料。
它使用后台任务从服务加载JSON数据,使用任务的getValue(...)
处理程序将其传递给创建list of few people on StackOverflow
的{{1}}。
createGridPane(onservableList)
的其中一列包含相应人物的个人资料照片。由于这些图片可能需要一段时间才能下载,因此我会为每位用户GridPane
生成GridPane
。
您可以找到setOnSucceeded(...)
。
它使用source code here作为库将multiple threads
转换为load the image
类。
JSON