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

JavaFX-如何在场景中编辑/使用变量

杭永安
2023-03-14

如何在JavaFX场景中更改标签的值?我试图找出一种方法来更改按钮单击时标签的文本值,但它不起作用。我为按钮和标签设置了一个fx:id,并设置了它们的控制器(CPCS305\u JAVAFX\u FXML,类本身)。按钮还链接到HandleButtoAction2()函数。

public class CPCS305_JAVAFX_FXML extends Application {

@FXML
Scene scene;
Stage stage;
Label main_label
Button login_button;
AnchorPane root;

@Override
public void start(Stage stage) throws Exception {
    root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
    scene = new Scene(root);
    stage.setScene(scene);
    stage.show();

@FXML
private void handleButtonAction2(ActionEvent event) throws IOException, Exception {
    main_label.setText("Hello World");
}

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

错误报告如下:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8413)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
... 45 moreCaused by: java.lang.NullPointerException
at cpcs305_javafx_fxml.CPCS305_JAVAFX_FXML.handleButtonAction2(CPCS305_JAVAFX_FXML.java:64)
... 55 more

我还有另外两个FXML文件及其控制器和函数,但我稍后再讨论。我想解决无法在一个场景中进行通信的问题,然后转到多个场景。

对新学习者有什么想法吗?

编辑:此类的FXML文件http://textuploader.com/d4wgi

编辑2:已修复。问题是错误的进口。很抱歉给大家带来麻烦,但感谢您的支持。

共有3个答案

糜帅
2023-03-14

我在Scene Builder上使用的按钮/标签使用了错误的导入。我修复了这些导入,一切正常。

龚振濂
2023-03-14

@FXML注释应该位于FXML文件中定义的唯一元素之上,例如标签、按钮和锚定窗格。

试试看。

郎玮
2023-03-14

您需要用@FXML注释每个实例字段,以便FXML加载器分配它。如果不这样做,值将保持为空。此外,FXML加载器需要知道哪个对象是控制器。您已经在FXML中指定了,但这意味着FXMLLoader将创建类的第二个实例,因为它确实有办法将其连接到当前类。您可以通过使用setController指定控制器,通过setControllerFactory指定控制器工厂,或者通过在一个或多个采用参数的静态函数中传递参数来实现。

由于在FXML中定义了类,因此需要使用控制器工厂。FXML加载程序将要求控制器工厂实例化作为参数提供的类的对象。当您想使用已经实例化的类时,只需忽略class参数并返回this。

public class CPCS305_JAVAFX_FXML extends Application {
    @FXML // because there is a fx:id="main_label"  in the FXML
    private Label main_label;  // Java naming convention would be mainLabel

    @FXML // because there is a fx:id="login_button"  in the FXML
    private Button login_button; // Java naming convention would be loginButton

    @Override
    public void start(Stage stage) throws Exception {
       FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLDocument.fxml"));
       loader.setControllerFactory(controllerClass -> this); // 'this' object will be the controller.
       Parent root = loader.load();
       Scene scene = new Scene(root);
       stage.setScene(scene);
       stage.show();
    }

   @FXML // because there is a onAction="#handleButtonAction" in the FXML
   private void handleButtonAction() { // parameter is optional
      main_label.setText("Hello World");
   }
}
 类似资料:
  • 本文将介绍使用 场景编辑器 创建和编辑场景图像时的工作流程和技巧。 使用节点创建菜单快捷添加基本节点类型 当我们开始在场景中添加内容时,一般会先从 层级管理器 的 创建节点菜单 开始,也就是点击左上角的 + 按钮弹出的菜单,从几个简单的节点分类中选择我们需要的基础节点类型并添加到场景中。 添加节点时,在 层级管理器 中选中的节点将成为新建节点的父节点,如果你选中了一个折叠显示的节点然后通过菜单添加

  • 场景编辑       点击对于场景的编辑按钮,进入该场景编辑界面。

  • 场景编辑       点击对于场景的编辑按钮,进入该场景编辑界面。 素材导入提示       点击不再显示,以后将不显示该提示,点击立即上传,打开素材导入面板。点击选择文件,即可上传文件。 场景信息       点击场景信息按钮,打开场景信息编辑栏。填写您想设置的信息。 点击设置封面按钮,将当前界面设置为场景封面 点击设置初始视角按钮,将当前视角设置为场景初始视角,进入场景后,将自动飞行到该视角。

  • 我看了很多页,试图找出如何切换场景,但都没有成功。 我有一个计算器,我的目标是选择一个菜单选项来更改计算器(即:基础和科学)。现在我只是在测试,所以这里是我到目前为止与这个问题相关的代码(我使用的是场景生成器): 编辑我已经尝试了很多东西。不管怎样,我总是得到这个NullPointerException。我有一种感觉,这可能与在场景生成器中设置某些内容有关,但我就是找不到答案 工作代码: 我使用下

  • 本文将介绍使用 场景编辑器 创建和编辑场景图像时的工作流程和技巧。 使用 Canvas 作为渲染根节点 在开始添加节点之前,我们先简单了解一下新建场景后默认存在的 Canvas 节点的作用,以及我们如何从这里开始场景的搭建。 Canvas 节点是我们推荐大家使用的 渲染根节点,这个的意思就是希望大家将所有渲染相关的节点都放在 Canvas 下面,这样做有以下好处: Canvas 能提供多分辨率自适

  • 问题内容: 我有一个使用javafx Scene来渲染某些东西的应用程序,并且我想将该渲染结果放入我在Javafx中创建的某些GUI中。我该怎么做? 基本上,有一些容器可以放入场景,然后将其放入GUI。 抱歉,如果是新手问题,我是JavaFX的新手 问题答案: 该场景只有一个顶级父节点作为根。您可以获取它并放入另一个场景。