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

带有自定义控制器的JavaFX自定义组件

栾和风
2023-03-14

我尝试用自定义控制器制作一个自定义组件。自定义组件已经显示在应用程序上,但我未能向其添加属性。

项目结构:

    null
package controller;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import java.net.URL;
import java.util.ResourceBundle;

public class TopBarBtn implements Initializable {

    public ImageView getIv() {
        return iv;
    }

    public HBox getHbox() {
        return hbox;
    }

    @FXML private ImageView iv;

    @FXML private HBox hbox;

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        
    }
}
package custom;

import controller.TopBarBtn;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.image.Image;
import javafx.scene.layout.HBox;
import java.io.IOException;

public class TopBarCloseBtn extends HBox {
    TopBarBtn controller;
    private final StringProperty imageUrl = new SimpleStringProperty("/res/image/white/closeX.png");

    public final StringProperty imageUrl() { return imageUrl; }

    public final String getImageUrl() { return imageUrl.get(); }

    public final void setImageUrl(String imageUrl) {
                                               this.imageUrl.set(imageUrl);
                                               controller.getIv().setImage(new Image(imageUrl));
                                           }

    public TopBarCloseBtn() {
        super();
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/res/template/closeBtn.fxml"));
            controller = new TopBarBtn();
            loader.setController(controller);
            Node n = loader.load();
            this.getChildren().add(n);
            controller.getIv().setImage(new Image(imageUrl.get()));
        } catch (IOException e) {

        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>

<HBox id="hbox" xmlns:fx="http://javafx.com/fxml/1" alignment="CENTER" prefHeight="27" prefWidth="40"
      styleClass="TopBarButtonClose" stylesheets="@../style/TopBarButton.css">
    <children>
        <ImageView id="iv" fitHeight="13" fitWidth="13" pickOnBounds="true" preserveRatio="true">
            <image>
                <Image url="/res/image/white/closeX.png"/>
            </image>
        </ImageView>
    </children>
</HBox>

布尔马尔科

完全错误:

原因:java.lang.nullPointerException:无法调用“javafx.scene.image.imageeview.setimage(javafx.scene.image.image)”,因为“controller.topbarbtn.getiv()”的返回值在custom.topbarclosebtn.(topbarclosebtn.java:33)在java.base/jdk.internal.reflect.nativeconstructoraccessorimpl.newinstance0(原生方法)在在java.base/java.lang.reflect.constructor.newInstance(delegatingConstructorAccessorimpl.java:45)在java.base/java.lang.reflect.reflect.reflectAccess.newInstance(reflector.java:499)在java.base/java.lang.reflect.reflectAccess.newInstance(reflectAccess.newInstance(reflectorAccess.javinstance)在fxml/javafx.fxml.fxmlloader$valueelement.processStartElement(FxmlLoader.java:756)在javafx.fxml/javafx.fxml.fxml.fxmlLoader.loadimpl(FxmlLoader.java:2634)在javafx.fxml/javafx.fxml.fxmlLoader.loadimpl.

共有1个答案

从建明
2023-03-14

我的closeBTN.fxml中缺少fx:id!感谢@kleopatra

 类似资料:
  • 我正在尝试使用基于自定义列表的自定义创建一个自定义。 自定义对象是名为的类名,其中包含一些用于消息内容、收件人、时间戳和状态(读取、发送等)的字段。 在看了这个问题:用FXML在JavaFX中定制ListView之后,我成功地做到了: null 现在,ConversationCell类: 我不能显示ConversationCellController,但我所能说的是,这是我(在其构造函数中)加载设

  • 本文向大家介绍Android自定义控件之自定义组合控件(三),包括了Android自定义控件之自定义组合控件(三)的使用技巧和注意事项,需要的朋友参考一下 前言: 前两篇介绍了自定义控件的基础原理Android自定义控件基本原理详解(一)、Android自定义控件之自定义属性(二)。今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发成本,以及维护成本。 使用自定义组合控件的好处? 我

  • 这似乎是一种非常“愚蠢”的方式...有人知道更好的方法吗?也许java有一些内置的方法?

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

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

  • 我正在用JavaFX制作一个2D游戏,当检测到冲突时,我得到的结果相当不准确,因为玩家精灵被设置为矩形的填充,因此没有预期的边框。有没有办法让我自己的形状尽可能准确? 我的另一个想法是检查碰撞的像素是否透明,然后如果它是,则不会结束游戏。有谁知道一种方法可以获得碰撞像素的坐标,以便从那里我可以使用PixelReader进行检查? 如果有人知道更好的方法,请告诉我! 谢谢,伊森