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

@FXML批注无法正常工作

乐正光誉
2023-03-14

我目前正在用JavaFX做一个小项目。我使用SceneBuilder创建了我的GUI的第一个草图。它仍然需要一些调整和样式,但我想看看它是否工作到目前为止。

我在GUI上有两个超链接,如果用户单击其中一个,默认的系统浏览器将打开一个特定的URL。

到目前为止,我得到了这个:

主要的爪哇:

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws MalformedURLException, IOException {

    DataBean dataBean= new DataBean(primaryStage);
    Controller controller = new Controller(dataBean);
    controller.show();
}

public static void main(String[] args) {
    launch(args);
}
}

数据库。爪哇:

public class DataBean {

private Stage primaryStage;

public DataBean(Stage stage) {

    primaryStage = stage;
}

public Stage getPrimaryStage() {
    return primaryStage;
}
}

测试视图。爪哇:

public class TestautomatView implements Initializable {

@FXML 
private ComboBox<String> environmentCombo;

@FXML 
private Hyperlink crhl;

@FXML
private Hyperlink help;

@Override
public void initialize(URL location, ResourceBundle resources) {

}

private Scene scene;
private BorderPane root;

public TestautomatView() throws MalformedURLException, IOException {
    root = FXMLLoader.load(new URL(TestautomatView.class.getResource("Sample.fxml").toExternalForm()));

    scene = new Scene(root);
}

public void show(Stage stage) {
    stage.setTitle("CrossReport Testautomat");
    stage.setScene(scene);
    stage.show();
}


public ComboBox<String> getEnvironmentCombo() {
    return environmentCombo;
}

public Hyperlink getCrhl() {
    return crhl;
}

public Hyperlink getHelp() {
    return help;
}

public Scene getScene() {
    return scene;
}

}

在我的控制器中,我想将ActionHandler设置为超链接,但它不起作用,因为我视图中的getters返回null。

public class Controller  {

private DataBean dataBean;
private TestautomatView view;

public Controller(DataBean databean) throws MalformedURLException, IOException {
    this.dataBean = databean;
    this.view = new TestautomatView();

    setActionHandlers();
}

public void show() throws MalformedURLException, IOException {
    view.show(dataBean.getPrimaryStage());
}

private void setActionHandlers() {
//      setHyperlink(view.getCrhl(), "www.example.com");
//      setHyperlink(view.getHelp(), "www.example2.com");
}

private void setHyperlink(Hyperlink hl, String uri) {
    hl.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            //TODO - Open Default Browser
        }
    });
}

}

当我启动我的应用程序时,我可以看到GUI,但是当我想要添加ActionHandler时,我会得到一个NullPointerException。

在ample.fxml文件中,超链接是HBox的子目录

<Hyperlink fx:id="crhl" text="Report" />
<Hyperlink fx:id="help" text="Help" />

但不仅仅是超链接,甚至当我在调试器中检查我的应用程序时,组合框也是空的。

我的错在哪里?

共有2个答案

顾宸
2023-03-14

正如在另一个答案中指出的,问题在于您“手动”创建了TestautomatView的实例。FXMLLoader的默认行为是创建FXML文件中指定的控制器类的实例,并将该实例用作控制器。因此,您有两个TestautomatView的实例:一个是您创建的(并有一个引用),另一个是由fxmloader创建的。它是第二个初始化了带有@FXML注释的字段。

您可以通过创建fxmloader实例并直接在其上设置控制器来更改此默认行为。例如考虑做:

public class TestautomatView implements Initializable {

    @FXML 
    private ComboBox<String> environmentCombo;

    @FXML 
    private Hyperlink crhl;

    @FXML
    private Hyperlink help;

    @Override
    public void initialize(URL location, ResourceBundle resources) {

    }

    private Scene scene;
    private BorderPane root;

    public TestautomatView() throws MalformedURLException, IOException {

        FXMLLoader loader = new FXMLLoader(TestautomatView.class.getResource("Sample.fxml"));
        loader.setController(this);
        root = loader.load();

        scene = new Scene(root);
    }

    // etc...

}

由于您是直接设置控制器,因此您需要从Sample.fxml文件中删除fx: Controlers属性才能正常工作。

您可能还对这个模式感兴趣,它与您在这里尝试的模式非常相似(尽管不完全相同)。

邓卓
2023-03-14

问题是您正在使用newtestAutomatView()手动创建控制器。它必须由FXMLLoader创建,注释才能工作。您还必须在示例中设置fx:controller属性。fxml到控制器(TestautomatView)的完全限定类名。

示例代码:

FXMLLoader fl = new FXMLLoader(new URL(TestautomatView.class.getResource("Sample.fxml").toExternalForm()));
root = fl.load();
TestautomatView controller = fl.getController();

PS:您应该将TestautomatView重命名为TestautomatController。FXML文件是您的“视图”。

 类似资料:
  • testFX。java: testFXController.java: 测验fxml: 当我运行testFX. java时,系统打印: 这是教授的代码,我似乎无法运行它。我意识到主要问题在代码

  • 问题内容: 因此,我的设置无法按我想要的方式工作。因此,每当我运行该程序时,它就会立即从0变为100。我尝试使用,任务,并尝试了,但没有任何尝试。 这是我的程序: @MadProgrammer这是我尝试做一名摆动工作人员并将每个名称写入文档并更新进度栏的尝试。该程序将达到86%左右并停止运行,永远不会创建完成的文档。该程序将创建一个空白文档。这是我首先创建的SwingWorker对象,这是两种方法

  • 问题内容: 我在JLayeredpane上有两个JPanels。其中一个显示pdf,重叠的一个具有透明背景(我使用过setOpaque(false))。现在,我可以将图形添加到透明面板中,这样看来我实际上是在注释pdf。我想要一个橡皮擦工具来删除这些注释。我尝试使用以下代码 其中path是由多条线构成的形状。现在,不是在先前的图形上绘制 透明线 ,而是绘制 黑线 。我要去哪里错了? 问题答案: 请

  • 问题内容: 这看起来有效,但无法正常工作。我希望菜单悬停时’huh’div不透明。我尝试了淡入/淡出效果,但效果很好,但只有一次很奇怪。 问题答案: 不带点使用:

  • 问题内容: 我正在编辑从tesseract ocr获得的一些电子邮件。 这是我的代码: 但是输出不正确。 输入: 输出: 但是,当我在每次替换后将结果分配给新的String时,它都能正常工作。为什么在同一字符串中连续分配不起作用? 问题答案: 您将在Javadoc中的String.replaceAll()中注意到,第一个参数是正则表达式。 句点()和管道()以及花括号()都有特殊的含义。您需要对它

  • 问题内容: 我正在编写3D绘画,但在Java中发现了问题。在代码的一部分中,它起作用了: 在另一种情况下,它不起作用: 你能告诉我如何使它工作吗?谢谢在我问之前,是的,它确实执行了那部分代码。 编辑: 哦,现在工作正常,谢谢 问题答案: 代替: