Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >拆分JavaFX控制器类

拆分JavaFX控制器类
EN

Stack Overflow用户
提问于 2018-09-16 21:44:10
回答 2查看 1.5K关注 0票数 3

我没有一个MCV代码示例,因为这个问题更具有全球性,而且我不认为具体的代码实际上会产生很大的影响。

我有一个GUI应用程序,它有几个元素(数据夹、下拉列表、入口字段、表视图),根据JavaFX one ControllerClass,随着时间的推移,这个应用程序变得相当大。

因此,我在研究一种把它分开的方法。在我的研究中,我发现了两种主要的方法:

把更多的程序逻辑从UI部分中提取出来,这当然是有意义的,我对某些部分也是这样做的,但是对于很多部分来说,这似乎非常不方便,例如,如果我有一个函数使用六个不同的GUI元素,那么从控制器类中提取这个方法似乎很奇怪,因为我需要在函数调用中给它提供所有的GUI元素引用。有什么更好的办法吗?就像只使用setters/getter填充Controller,并将每个方法this作为参数,这样它就可以进入this.dropbox1了吗?

我发现的第二种方法是将GUI本身分割成几个场景。类似于this问题,但我不知道如何将一个GUI分割成几个场景,并将其放在一个窗口中。我知道您可以在主FXML文件中加载其他FXML文件,但我不知道如何将它们合并到一个窗口中的GUI中。如果有人有一个小示例代码,我将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2018-09-18 01:07:23

欢迎来到Stackoverflow,关于拆分:

您可以有一个根FXML,例如只包含一个GridPane (或者其他的东西,但我将继续在一个GridPane的前提下),现在您在那个根FXML文件中设置网格(没有内容),如果您已经完成了一个GUI,您应该清楚地知道网格单元需要有多大。在你的主课里你有:

扩展应用程序并启动GUI的主类

代码语言:javascript
运行
AI代码解释
复制
public class GUI extends Application {

    private Stage stage;
    private GridPane rootGrid;

    @Override
    public void start(Stage stage) {

        this.stage = stage;

        // Load root layout from fxml file.
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(WindowRoot.class.getResource("RootGrid.fxml"));
        rootGrid = (GridPane) loader.load();

        // Show the scene containing the root layout.
        Scene scene = new Scene(rootGrid);
        stage.setTitle("Test");
        stage.show();
        //fill the Grid
        setupGrid();
    }

现在您有了rootGrid作为类属性,它只是一个网格,其中包含在RootGrid.fxml中设置的空行/列,可以简单到如下所示:

FXML示例,两行,两列,没有内容

代码语言:javascript
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>


<GridPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.141">
   <rowConstraints>
      <RowConstraints minHeight="10.0" prefHeight="30.0" />
      <RowConstraints minHeight="10.0" prefHeight="30.0" />
   </rowConstraints>
   <columnConstraints>
      <ColumnConstraints minWidth="10.0" prefWidth="100.0" />
      <ColumnConstraints minWidth="10.0" prefWidth="100.0" />
   </columnConstraints>
</GridPane>

现在,为要填充的每个单元格创建FXML文档,在该AnchorPane中有一个包含该单元格内容的FXML。然后将其作为start方法的一部分添加到网格中。假设在这个简单的例子中,你想要一个菜单栏。为菜单创建一个FXML:

简单菜单fxml示例:

代码语言:javascript
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.layout.AnchorPane?>


<AnchorPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.141">
   <children>
      <MenuBar>
        <menus>
          <Menu mnemonicParsing="false" text="File">
            <items>
              <MenuItem mnemonicParsing="false" text="Close" />
            </items>
          </Menu>
        </menus>
      </MenuBar>
   </children>
</AnchorPane>

并将其作为start方法的一部分添加到网格中(但可能将其解压到您在start中调用的方法中,如setupGrid() )。

建立网格,在启动(阶段)阶段调用

代码语言:javascript
运行
AI代码解释
复制
private void setupGrid() {
    // Add Menubar
    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(WindowRoot.class.getResource("menubar.fxml"));
    AnchorPane anchor = (AnchorPane) loader.load();
    //put it in first column, first row
    GridPane.setConstraints(anchor, 0, 0);
    //optional, let it span both/all columns
    GridPane.setRowSpan(anchor, 2);
    rootGrid.getChildren().add(anchor);

您将需要尝试/除了IO块,为了更好的可读性,不要使用它们。对于其他“根窗格”,您将需要其他设置-方法,例如,有一个borderPane,您会有类似于rootGrid.setTop(anchor)的东西。

希望能帮上忙。玩得开心。

票数 1
EN

Stack Overflow用户

发布于 2018-09-18 01:26:07

如果您使用FXML,简单的事情是为FXML (一对一)设置一个控制器,而且我还添加了一个css,这是一种模式。

然后,您必须将屏幕分割成小部分:2种方法:

  • 使用fx:include :您包括一个FXML本身声明了一个控制器
  • 使用组件:包含组件的标记,它本身可以加载FXML和控制器

然后,您必须在控制器之间进行组合,最好的方法是有一个模型层,并通过单例共享它,例如使用afterburnerfx (一个非常小的注射器)。

当使用fx:include时,您还可以使用“嵌套控制器”从父控制器获得子控制器的引用。

最后,您的对象可能是具有可观察性的javaFX Beans,并且您只向另一个控制器公开可观察的而不是可视的组件:这样您的组件之间就有了松散的耦合。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52361378

复制
相关文章
BackgroundWorker在单独的线程上执行操作
直接使用多线程有时候会带来莫名其妙的错误,不定时的发生,有时候会让程序直接崩溃,其实BackgroundWorker 类允许您在单独的专用线程上运行操作。可以通过编程方式创建 BackgroundWorker,也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。如果在 Windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。
张果
2022/05/09
1.3K0
BackgroundWorker在单独的线程上执行操作
在 WPF 中实现融合效果
融合效果是指对两个接近的元素进行高斯模糊后再提高对比度,使它们看上去“粘”在一起。在之前的一篇文章中,我使用 Win2D 实现了融合效果,效果如下:
dino.c
2022/10/05
1.4K0
在 WPF 中实现融合效果
在 Emacs 中编辑 crontab
一般来说,编辑 crontab 时可以用 crontab -e ,它会读取 EDITOR 环境变量来决定需要打开的编辑器,比如:
飞驰的西瓜
2023/03/01
7050
在 Emacs 中编辑 crontab
在 WPF 中获取一个依赖对象的所有依赖项属性
本来 .NET 中提供了一些专供设计器使用的类型 TypeDescriptor 可以帮助设计器找到一个类型或者组件的所有可以设置的属性,不过我们也可以通过此方法来获取所有可供使用的属性。
walterlv
2023/10/22
7350
并发编程 ---为何要线程池化
众所周知,使用线程可以极大的提高应用程序的效率和响应性,提高用户体验,但是不可以无节制的使用线程,为什么呢?
Niuery Diary
2023/10/22
2030
并发编程 ---为何要线程池化
在 Docker 容器中编辑文件
我希望每次在docker容器中安装vi的时候谁会给我1美元...我想要一个在运行的docker容器编辑文件的更简单的方式。首先,尝试避免编辑文件,这违背了容器的哲学理念(见最后一段)。
星哥玩云
2022/07/03
5.6K0
在 Docker 容器中编辑文件
如果在BackgroundWorker运行过程中关闭窗体…
在Windows Form应用中,BackgroundWorker 类允许您在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。由于操作是异步执行的,用户可能在异步操作执行过程中关闭当前窗体,而窗体的关闭会伴随着Dispose方法的执行。如果我们注册了BackgroundWorker的RunWorkerC
蒋金楠
2018/02/07
1.3K0
如果在BackgroundWorker运行过程中关闭窗体…
在Cookie中存储对象
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/46955119
DannyHoo
2018/09/13
4K0
backgroundworker组件的使用
本文转载:http://www.cnblogs.com/inforasc/archive/2009/10/12/1582110.html
跟着阿笨一起玩NET
2018/09/19
1K0
使用nano在Linux中编辑文件
GNU nano,简称nano,是大多数Linux发行版的基本内置编辑器。GNU nano是一个小巧友好的文本编辑器. 与基本的文本编辑相比,nano提供许多额外的特性,例如:交互式的查找和替换,定位到指定的行列,自动缩进,特性切换,国际化支持,以及文件名标记完成。本教程中,我们将介绍一些帮助您入门的基本知识。
风研雨墨
2018/08/17
7.5K0
WPF性能优化:Freezable 对象
Freezable是WPF中一个特殊的基类,用于创建可以冻结(Freeze)的可变对象。冻结一个对象意味着将其状态设置为只读,从而提高性能并允许在多线程环境中共享对象。
czwy
2023/10/22
4470
C# BackgroundWorker用法详解
在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题。解决这类问题的主要途径是使用多线程,启动一个后台线程,把运算操作放在这个后台线程中完成。但是原生接口的线程操作有一些难度,如果要更进一步的去完成线程间的通信就会难上加难。
zls365
2021/01/13
1.4K0
C# BackgroundWorker用法详解
在 JavaScript 中如何克隆对象?
我们假设一个变量 name 具有一个与之关联的原始值(number,string,boolean,undefined 和null)。 如果我们将此变量 name 复制到另一个变量name2 ,则原始变量的任何修改都不会影响到第二个变量,因为它们是原始值。
前端小智@大迁世界
2022/06/15
4.9K0
【6】VScode 无法在终端输入问题,提示:无法在只读编辑器中编辑
2.在设置中输入 run code config 找到里面的 run in terminal 打勾即可,往下滑动几秒就看到了
汀丶人工智能
2022/12/21
7.5K0
【6】VScode 无法在终端输入问题,提示:无法在只读编辑器中编辑
6搞懂线程池(二)
抱歉各位多线程专栏托更这么久,这篇文章我们继续讲线程池的相关知识,其中将涉及到如下知识:
喵叔
2020/09/08
5080
在 WPF 程序中应用 Windows 10 真•亚克力效果
从 Windows 10 (1803) 开始,Win32 应用也可以有 API 来实现原生的亚克力效果了。不过相比于 UWP 来说,可定制性会差很多。
walterlv
2023/10/22
5880
在 WPF 程序中应用 Windows 10 真•亚克力效果
学习WPF——了解WPF中的XAML
XAML的简单说明 XAML是用于实例化.NET对象的标记语言,主要用于构建WPF的用户界面 XAML中的每一个元素都映射为.NET类的一个实例,例如<Button>映射为WPF的Button对象 XAML可以在一个元素中嵌套另一个元素,例如Grid元素可以嵌套Button元素 了解XAML VisualStudio创建一个窗口,默认情况下产生的代码如下: 这段代码中包含两个标记元素,一个是Window,一个是Grid Window是WPF顶级元素的一种,还有另外两种顶级元素Page和App
liulun
2018/01/12
2K0
在 Hue 中启用 Phoenix SQL 编辑器
在CDP7.1.8开始,Hue支持了很多编辑器,这里介绍了在CDP7.1.8中配置Hue支持Phoenix SQL。
大数据杂货铺
2022/12/02
1.7K0
在 Hue 中启用 Phoenix SQL 编辑器
JAVA对象在JVM中内存分配
如果你还不了解JVM内存模型的建议您先看下JVM内存模型 以一下代码为例,来分析下,java的实例对象在内存中的空间分配(JDK1.8)。 public class Student { private String name; private static Birthday birthday = new Birthday(); public Student(String name) { this.name = name; } public sta
java404
2018/05/18
1.9K0
WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件
在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项。不过,通常更有实际价值的是更复杂的 UWP 控件的引入,通常是一整个 Page。
walterlv
2020/02/10
6K0

相似问题

在BackgroundWorker中填充WPF图表

20

WPF BackgroundWorker执行

21

BackgroundWorker和WPF

30

在WPF中用BackgroundWorker更新UI

32

在WPF中结合使用BackgroundWorker和ProgressBar

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档