当前位置: 首页 > 知识库问答 >
问题:

SceneBuilder自定义控件类路径

谷梁子昂
2023-03-14

>

  • 我是使用fx:root,还是不使用它?我选择用它。所以在控件的controller+root类中,我将自己设置为root和controller,就像需要的那样。但它仍然说“root尚未设置。在加载之前使用setRoot()方法。”

    在包含自定义控件的父FXML中,我应该导入什么?

    正确的类路径是什么,以便我可以在SceneBuilder2.0中显示我的自定义控件?我根本不太明白“/.../.../.../bin”这件事。

    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import java.lang.*?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.layout.*?>
    <?import javafx.scene.layout.HBox?>
    
    
    <fx:root type="HBox" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8">
       <children>
          <ProgressBar fx:id="progressBar" prefWidth="200.0" progress="0.0" />
       </children>
    </fx:root>
    
    package application.ctrl;
    
    import java.io.IOException;
    
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.control.ProgressIndicator;
    import javafx.scene.layout.HBox;
    import application.Main;
    
    public class ProgressSelector extends HBox {
    
        @FXML
        private ProgressIndicator progressBar;
    
    
    
        public ProgressSelector() {
            FXMLLoader loader = new FXMLLoader(getClass().getResource(
                    Main.PROGRESS_SELECTOR));
            loader.setRoot(this);
            loader.setController(this);
            loader.setClassLoader(this.getClass().getClassLoader());
            try {
                loader.load();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import javafx.scene.text.*?>
    <?import javafx.geometry.*?>
    <?import java.lang.*?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.layout.*?>
    <?import javafx.scene.layout.VBox?>
    <?import application.ctrl.ProgressSelector?>
    
    <VBox fx:id="vbox" spacing="5.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.ctrl.ObjectiveEditorCtrl">
       <children>
          <HBox>
             <children>
                <Button mnemonicParsing="false" onAction="#back" text="&lt;" />
                <Label text="Editing Objective:" />
             </children>
          </HBox>
          <TextField fx:id="objectiveName" />
          <ProgressSelector />
          <HBox>
             <children>
                <Label text="Planned Start:" />
                <Region HBox.hgrow="ALWAYS" />
                <DatePicker fx:id="plannedStart" />
             </children>
          </HBox>
          <HBox>
             <children>
                <Label text="Actual Start:" />
                <Region HBox.hgrow="ALWAYS" />
                <DatePicker fx:id="actualStart" />
             </children>
          </HBox>
          <HBox>
             <children>
                <Label text="Planned Finish:" />
                <Region HBox.hgrow="ALWAYS" />
                <DatePicker fx:id="plannedFinish" />
             </children>
          </HBox>
          <HBox>
             <children>
                <Label text="Actual Finish:" />
                <Region HBox.hgrow="ALWAYS" />
                <DatePicker fx:id="actualFinish" />
             </children>
          </HBox>
          <HBox alignment="CENTER_RIGHT">
             <children>
                <Button mnemonicParsing="false" onAction="#save" text="Save" />
                <Button mnemonicParsing="false" onAction="#back" text="Cancel" />
             </children>
          </HBox>
       </children>
       <padding>
          <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
       </padding>
    </VBox>
    

    其控制器:

    package application.ctrl;
    
    import interfaces.ControlledScreenInterface;
    
    import java.net.URL;
    import java.util.ResourceBundle;
    
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.DatePicker;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.VBox;
    import application.ScreenController;
    import application.objects.Objective;
    
    public class ObjectiveEditorCtrl implements Initializable,
            ControlledScreenInterface {
    
        @FXML
        private TextField objectiveName;
        @FXML
        private ProgressSelector completion;
        @FXML
        private DatePicker plannedStart;
        @FXML
        private DatePicker plannedFinish;
        @FXML
        private DatePicker actualStart;
        @FXML
        private DatePicker actualFinish;
        @FXML
        private VBox vbox;
    
        private ScreenController parent;
        private Objective current;
    
    
    
        @Override
        public void initialize(URL location, ResourceBundle resources) {
            // TODO Auto-generated method stub
    
        }
    
    
    
        public void init(Objective current) {
            this.current = current;
            objectiveName.setText(current.getName());
            // completion.setProgress(current.getCompletion());
            plannedStart.setValue(current.getPlannedStart());
            actualStart.setValue(current.getActualStart());
            plannedFinish.setValue(current.getPlannedFinish());
            actualFinish.setValue(current.getActualFinish());
        }
    
    
    
        public void save() {
            // current.setName(objectiveName.getText());
            // // current.setCompletion(completion.getProgress());
            // current.setPlannedStart(plannedStart.getValue());
            // current.setPlannedFinish(plannedFinish.getValue());
            // current.setActualStart(actualStart.getValue());
            // current.setActualFinish(actualFinish.getValue());
            // back();
        }
    
    
    
        public void back() {
            parent.back();
        }
    
    
    
        @Override
        public void setParentScreen(ScreenController parent) {
            this.parent = parent;
        }
    }
    
  • 共有1个答案

    卫建义
    2023-03-14

    这里有很多问题。

    1-使用fx:root允许您自定义FXMLLoader,您可以改变实例化组件的方式:如何用不同的fxml文件创建多个javafx控制器?

    但是,在SceneBuilder2中,它并不能很好地工作!Scene Builder 2的“规范”方式(与1配合得很好)似乎不使用fx:root。

     类似资料:
    • 我有一个自定义JavaFx控件,它在我的应用程序中呈现。但是,我无法让SceneBuilder理解它。 我有customTextField.java/customTextField.CustomTextField继承自UserControl,如这里所定义的,但我创建的任何自定义控件都会出现场景生成器问题。 首先,我必须将import语句更改为通配符。从 sample.fxml:

    • 我希望有人能向我解释一下为什么SceneBuilder在导入自定义控件时如此温和。 以一个相对简单的自定义控件为例(仅作为示例): 然后你有控制器类在这里: 这工作得很好。.jar编译得很好,SceneBuilder读取的.jar很好,它导入的控件也很好,这很好。 让我恼火的是,它需要两个独立的类来完成,这没什么大不了的,除了我觉得只用一个类就可以做到这一点。 我现在有了上面的方法,但是我尝试了另

    • 我需要在窗格上有一个选择监听器和选择方法,以便在单击节点时能够监视并显示突出显示。 我做了以下操作: 这工作得很好 - 但是我无法再使用场景构建器,因为我的FXML引用了此而不是。我不确定如何将我的自定义窗格放入场景构建器。我已经看过其他问题,它们都是FXML和控制器的组合 - 这只是一个。 有没有人知道这样做的方法,或者在初始化时将< code>Pane换成< code > PaneWithSe

    • 我跟随这个博客向Scene Builder 2.0添加了一个自定义JavaFX组件,并构建了自己的自定义组件。 FXML文件: 控制器类: 样式表: 现在我的问题是我不能改变场景生成器中标签的值。我们是否可以创建一个自定义字段,该字段将出现在场景生成器上,并有助于更改标签文本?

    • 自定义控件用JavaScript和原生平台支持的语言编写。它们使用原生Tabris.js客户端的接口,并被封装在Cordova插件中。本文将介绍JavaScript的实现部分。 用JavaScript定义自定义控件 自定义控件必须继承自Widget。它能够与自定义控件的原生部分进行通信。 自定义控件类必须覆写_nativeType属性的getter以返回与原生实现匹配的类型: class MyCu

    • PyQt5 有丰富的组件,但是肯定满足不了所有开发者的所有需求,PyQt5 只提供了基本的组件,像按钮,文本,滑块等。如果你还需要其他的模块,应该尝试自己去自定义一些。 自定义组件使用绘画工具创建,有两个基本方式:根据已有的创建或改进;通过自己绘图创建。 Burning widget 这个组件我们会在 Nero,K3B,或者其他 CD/DVD 烧录软件中见到。 #!/usr/bin/python3