dede 网站地图 模块,中国工厂网,iis 网站后台,外贸网站如何优化spring javafx我将从一个大胆的声明开始#xff1a;我一直很喜欢Java Swing或applet。 在那里#xff0c;我说了。 如果我进行一些自我分析#xff0c;那么这种钦佩可能是在我接触Java时开始的。 Swing#xff08;实际上#xff09;是我使用Java所做的第一件事#xff0c… spring javafx 我将从一个大胆的声明开始我一直很喜欢Java Swing或applet。 在那里我说了。 如果我进行一些自我分析那么这种钦佩可能是在我接触Java时开始的。 Swing实际上是我使用Java所做的第一件事它给出了一些统计结果并使我能够使用该语言做一些事情。 在我年轻的时候我们建立了一些自制的胖客户来管理我们的3.5英寸软盘/ CD集合用VB编写然后用Basic编写这可能也起到了作用。 无论如何足以说明我的个人稀缺性。 事实是Swing帮助许多人构建了出色的应用程序但众所周知Swing有其缺点。 对于初学者来说很长一段时间以来一直没有发展。 如果还需要很多样板代码 您想要创建高质量的代码。 它带有一些古怪的设计“缺陷”缺少MVC等现成的模式。 样式有点局限性因为您必须依靠有限的LF架构默认情况下不会内置I18N。 可以说现在开发Swing很好基本上可以追溯到过去。 幸运的是Oracle几年前通过启动JavaFX试图改变这一状况。 我记得在Devoxx或Javapolis当时的名称上被引入JavaFX。 漂亮的演示程序看起来非常有前途所以我很高兴看到Swing的继任者终于来了。 从我看到其内部结构的那一刻起情况就发生了变化。 它的主要缺点之一是它基于一种黑暗的新语法称为JavaFX脚本。 如果您从未见过JavaFX脚本 它看起来像JavaJSON和JavaScript之间的怪异品种。 尽管已将其编译为Java字节码并且可以使用其中的Java API但与Java的集成从未真正好。 语言本身尽管功能很强大要求您花费大量时间来了解细节以便最终获得源代码但是这次比普通的Java代码更难管理和支持。 事实证明我并不是唯一的一个。 很多人都感到相同当然也有其他原因JavaFX从来没有取得过成功。 但是不久前Oracle通过引入JavaFX 2改变了潮流。 首先他们摆脱了JavaFX脚本不再受支持并将其转变为真正的本机Java SE APIJavaFX 2.2.3是Java 7 SE更新6的一部分。 JavaFX API现在看起来更像是熟悉的Swing API这是一件好事。 它为您提供了布局管理器的外观事件侦听器以及您以前习惯的所有其他组件但效果甚至更好。 因此如果您希望像Swing一样编写JavaFX尽管语法和改进的体系结构稍有不同。 现在也可以 将现有的Java Swing应用程序与JavaFX混合在一起 。 但是还有更多。 他们引入了一种基于XML的标记语言使您可以描述视图。 这具有一些优点首先是XML编码比Java编码更快。 与Java相比可以更容易地生成XML并且用于描述视图的语法也更加紧凑。 使用某种标记表示视图也更加直观尤其是如果您曾经做过一些Web开发。 因此可以拥有以FXML描述的视图即其调用方式应用程序控制器与该视图分离在Java中是这样和在CSS中的样式是的因此不再有LFCSS支持是标准的。 您仍然可以直接在FXML中嵌入Java或其他语言。 但这可能不是您想要的脚本反模式。 另一个好处是对绑定的支持。 通过将fxid属性放在视图组件上并将FXML批注放在应用程序控制器中的实例变量上可以将视图中的每个组件绑定到应用程序控制器。 然后将自动注入相应的元素因此您可以在应用程序控制器内部更改其数据或行为。 事实证明使用一些代码行您就可以轻松集成所选的DI框架这不是很好吗 那工具呢 好吧首先有一个用于Eclipse的插件fxclipse它将动态呈现FXML。 您可以通过Eclipse市场安装它 该插件将立即呈现您进行的任何调整 请注意至少需要JDK7u6才能使该插件正常工作。 如果您的JDK太旧则会在Eclipse中看到一个空白窗格。 另外如果您创建JavaFX项目则需要将jfxrt.jar手动放入构建类路径中。 您可以在JAVA_HOME/ jre / lib中找到此文件。 直到知道该插件在视觉上通过拖放对您没有帮助但那里有一个单独的IDE 现场建设者 。 该构建器也集成在Netbeans中对于AFAIK尚不支持eclipse因此如果要使用它则必须单独运行它。 该构建器允许您使用拖放方式以可视方式开发FXML。 细节不错 场景构建器实际上是用JavaFX编写的。 然后您还有一个名为Scenic View的单独的应用程序它对正在运行的JavaFX应用程序进行自省并显示其构建方式。 您将获得具有不同节点及其层次结构的图。 对于每个节点您可以看到其属性等等 好的让我们从一些代码示例开始。 我要做的第一件事是在场景生成器中设计演示应用程序 我通过将容器/控制器dd放在视图上以图形方式进行了此操作。 我还提供了要绑定到我的视图和fxid的控件您也可以通过场景生成器来做到这一点 特别是对于按钮我还添加了onAction单击按钮后应在控制器上执行的方法 接下来我在Eclipse的源代码视图中手动添加了控制器。 每个FXML只能有一个控制器应该在顶层元素中声明它。 我制作了两个FXML一个代表主屏幕另一个代表菜单栏。 您可能希望将逻辑划分为多个控制器而不是在单个控制器中塞满很多东西–在这里单一职责是一个很好的设计指南。 第一个FXML是“ search.fxml”代表搜索条件和结果视图 ?xml version1.0 encodingUTF-8??import java.lang.*?
?import java.util.*?
?import javafx.scene.control.*?
?import javafx.scene.control.Label?
?import javafx.scene.control.cell.*?
?import javafx.scene.layout.*?
?import javafx.scene.paint.*?StackPane idStackPane maxHeight-Infinity maxWidth-Infinity minHeight-Infinity minWidth-Infinity prefHeight400.0 prefWidth600.0 xmlns:fxhttp://javafx.com/fxml fx:controllerbe.error.javafx.controller.SearchControllerchildrenSplitPane dividerPositions0.39195979899497485 focusTraversabletrue orientationVERTICAL prefHeight200.0 prefWidth160.0itemsGridPane fx:idgrid prefHeight91.0 prefWidth598.0childrenfx:include source/menu.fxml/GridPane prefHeight47.0 prefWidth486.0 GridPane.columnIndex1 GridPane.rowIndex5childrenButton fx:idclear cancelButtontrue mnemonicParsingfalse onAction#clear textClear GridPane.columnIndex1 GridPane.rowIndex1 /Button fx:idsearch defaultButtontrue mnemonicParsingfalse onAction#search textSearch GridPane.columnIndex2 GridPane.rowIndex1 //childrencolumnConstraintsColumnConstraints hgrowSOMETIMES maxWidth338.0 minWidth10.0 prefWidth338.0 /ColumnConstraints hgrowSOMETIMES maxWidth175.0 minWidth0.0 prefWidth67.0 /ColumnConstraints hgrowSOMETIMES maxWidth175.0 minWidth10.0 prefWidth81.0 //columnConstraintsrowConstraintsRowConstraints maxHeight110.0 minHeight10.0 prefHeight10.0 vgrowSOMETIMES /RowConstraints maxHeight72.0 minHeight10.0 prefHeight40.0 vgrowSOMETIMES //rowConstraints/GridPaneLabel alignmentCENTER_RIGHT prefHeight21.0 prefWidth101.0 textProduct name: GridPane.columnIndex0 GridPane.rowIndex1 /TextField fx:idproductName prefWidth200.0 GridPane.columnIndex1 GridPane.rowIndex1 /Label alignmentCENTER_RIGHT prefWidth101.0 textMin price: GridPane.columnIndex0 GridPane.rowIndex2 /Label alignmentCENTER_RIGHT prefWidth101.0 textMax price: GridPane.columnIndex0 GridPane.rowIndex3 /TextField fx:idminPrice prefWidth200.0 GridPane.columnIndex1 GridPane.rowIndex2 /TextField fx:idmaxPrice prefWidth200.0 GridPane.columnIndex1 GridPane.rowIndex3 //childrencolumnConstraintsColumnConstraints hgrowSOMETIMES maxWidth246.0 minWidth10.0 prefWidth116.0 /ColumnConstraints fillWidthfalse hgrowSOMETIMES maxWidth537.0 minWidth10.0 prefWidth482.0 //columnConstraintsrowConstraintsRowConstraints maxHeight64.0 minHeight10.0 prefHeight44.0 vgrowSOMETIMES /RowConstraints maxHeight68.0 minHeight0.0 prefHeight22.0 vgrowSOMETIMES /RowConstraints maxHeight68.0 minHeight10.0 prefHeight22.0 vgrowSOMETIMES /RowConstraints maxHeight68.0 minHeight10.0 prefHeight22.0 vgrowSOMETIMES /RowConstraints maxHeight167.0 minHeight10.0 prefHeight14.0 vgrowSOMETIMES /RowConstraints maxHeight167.0 minHeight10.0 prefHeight38.0 vgrowSOMETIMES //rowConstraints/GridPaneStackPane prefHeight196.0 prefWidth598.0childrenTableView fx:idtable prefHeight200.0 prefWidth200.0columnsTableColumn prefWidth120.0 resizabletrue textOrderIdcellValueFactoryPropertyValueFactory propertyorderId //cellValueFactory/TableColumnTableColumn prefWidth120.0 textCustomerIdcellValueFactoryPropertyValueFactory propertycustomerId //cellValueFactory/TableColumnTableColumn prefWidth120.0 text#productscellValueFactoryPropertyValueFactory propertyproductsCount //cellValueFactory/TableColumnTableColumn prefWidth120.0 textDeliveredcellValueFactoryPropertyValueFactory propertydelivered //cellValueFactory/TableColumnTableColumn prefWidth120.0 textDelivery dayscellValueFactoryPropertyValueFactory propertydeliveryDays //cellValueFactory/TableColumnTableColumn prefWidth150.0 textTotal order pricecellValueFactoryPropertyValueFactory propertytotalOrderPrice //cellValueFactory/TableColumn/columns/TableView/children/StackPane/items/SplitPane/children
/StackPane 在第11行上您可以看到我配置了应与视图一起使用的应用程序控制器类。 在第17行您可以看到单独的menu.fxml的导入如下所示 ?xml version1.0 encodingUTF-8??import javafx.scene.control.*?
?import javafx.scene.layout.*?
?import javafx.scene.control.MenuItem?Pane prefHeight465.0 prefWidth660.0 xmlns:fxhttp://javafx.com/fxml fx:controllerbe.error.javafx.controller.FileMenuControllerchildrenMenuBar layoutX0.0 layoutY0.0menusMenu mnemonicParsingfalse textFileitemsMenuItem textExit onAction#exit / /items/Menu/menus/MenuBar/children
/Pane 在第7行您可以看到它使用了另一个控制器。 在Eclipse中如果从插件打开fxclipse视图则将获得与场景构建器相同的渲染视图。 如果您想在代码中进行少量更改以使其直接反映出来那么它很方便启动应用程序的代码非常标准 package be.error.javafx;import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;public class TestApplication extends Application {private static final SpringFxmlLoader loader new SpringFxmlLoader();Overridepublic void start(Stage primaryStage) {Parent root (Parent) loader.load(/search.fxml);Scene scene new Scene(root, 768, 480);primaryStage.setScene(scene);primaryStage.setTitle(JavaFX demo);primaryStage.show();}public static void main(String[] args) {launch(args);}
} 唯一需要注意的是我们从Application扩展。 这是一个样板代码例如它将确保UI的创建发生在JavaFX应用程序线程上。 您可能还记得Swing中的此类故事其中每个UI交互都需要在事件分派器线程EDT上发生JavaFX也是一样。 当您被应用程序回调时默认情况下您处于“右线程”状态例如动作侦听器等方法。 但是如果您启动应用程序或在单独的线程中执行长时间运行的任务则需要确保在正确的线程上启动UI交互。 挥杆你会用 JavaFX的SwingUtilities.invokeLater Platform.runLater 。 更特别的是我们的SpringFxmlLoader package be.error.javafx;import java.io.IOException;
import java.io.InputStream;import javafx.fxml.FXMLLoader;
import javafx.util.Callback;import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class SpringFxmlLoader {private static final ApplicationContext applicationContext new AnnotationConfigApplicationContext(SpringApplicationConfig.class);public Object load(String url) {try (InputStream fxmlStream SpringFxmlLoader.class.getResourceAsStream(url)) {System.err.println(SpringFxmlLoader.class.getResourceAsStream(url));FXMLLoader loader new FXMLLoader();loader.setControllerFactory(new CallbackClass?, Object() {Overridepublic Object call(Class? clazz) {return applicationContext.getBean(clazz);}});return loader.load(fxmlStream);} catch (IOException ioException) {throw new RuntimeException(ioException);}}
} 高亮显示的行显示了自定义ControllerFactory。 无需设置此JavaFX即可简单地实例化您在FXML中指定为控制器的类而无需任何特殊操作。 在这种情况下该类将不受Spring管理除非您将使用CTW / LTW AOP。 通过指定自定义工厂我们可以定义控制器的实例化方式。 在这种情况下我们从应用程序上下文中查找bean。 最后我们有两个控制器SearchController package be.error.javafx.controller;import java.math.BigDecimal;
import java.net.URL;
import java.util.ResourceBundle;import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;import be.error.javafx.model.Order;
import be.error.javafx.model.OrderSearchCriteria;
import be.error.javafx.model.OrderService;public class SearchController implements Initializable {Autowiredprivate OrderService orderService;FXMLprivate Button search;FXMLprivate TableViewOrder table;FXMLprivate TextField productName;FXMLprivate TextField minPrice;FXMLprivate TextField maxPrice;Overridepublic void initialize(URL location, ResourceBundle resources) {table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);}public void search() {OrderSearchCriteria orderSearchCriteria new OrderSearchCriteria();orderSearchCriteria.setProductName(productName.getText());orderSearchCriteria.setMaxPrice(StringUtils.isEmpty(minPrice.getText()) ? null:new BigDecimal(minPrice.getText()));orderSearchCriteria.setMinPrice(StringUtils.isEmpty(minPrice.getText()) ? null: new BigDecimal(minPrice.getText()));ObservableListOrder rows FXCollections.observableArrayList();rows.addAll(orderService.findOrders(orderSearchCriteria));table.setItems(rows);}public void clear() {table.setItems(null);productName.setText();minPrice.setText();maxPrice.setText();}
} 高亮显示的行按各自的顺序排列 由Spring自动注入这是我们的Spring托管服务将用于从中查找数据 JavaFX自动注入我们需要在控制器中进行操作或读取的控件 一种特殊的init方法来初始化我们的表以便在视图放大时列将自动调整大小 按下搜索按钮时将调用的操作侦听器样式回调 按下清除按钮时将调用的操作侦听器样式回调 最后FileMenuController除了关闭我们的应用程序外没有其他特殊功能 package be.error.javafx.controller;import javafx.application.Platform;
import javafx.event.ActionEvent;public class FileMenuController {public void exit(ActionEvent actionEvent) {Platform.exit();}
} 最后不太令人兴奋结果 搜索后 使视图更宽也拉长了列 文件菜单允许我们退出 在玩完JavaFX2之后我印象深刻。 还有越来越多的控件我相信已经有了浏览器控件之类。 所以我认为我们在这里是正确的。 参考来自Koen Serneels –技术博客博客的JCG合作伙伴 Koen Serneels提供的带有Spring的JavaFX 2 。 翻译自: https://www.javacodegeeks.com/2013/03/javafx-2-with-spring.htmlspring javafx