java - 使用 IntelliJ 2018.1 和 Scene Builder 9.0.1 更改场景
问题描述
我创建了一个新的 JavaFx 项目。在项目中,我有一个Main
类、一个Controller
类和一个设计文件。
当我单击“新产品”时,我想加载一个名为new_product.fxml
.
但是,当我单击“新产品”按钮时出现错误:
Caused by: java.lang.NullPointerException
at sample.Main.changeScene(Main.java:33)
at sample.Controller.buttonNewProductOnMouseClicked(Controller.java:21)
在 Main.java 第 33 行是primaryStage
. 看起来我的控制器无法访问它?
package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
public class Main extends Application {
Stage primaryStage;
@Override
public void start(Stage primaryStage) throws Exception{
this.primaryStage = primaryStage;
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
Scene primaryScene = new Scene(root, 300, 275);
primaryStage.setScene(primaryScene);
primaryStage.show();
}
public void changeScene(String fxml){
Parent pane = null;
try {
pane = FXMLLoader.load(getClass().getResource(fxml));
} catch (IOException e) {
e.printStackTrace();
}
Scene scene = new Scene( pane );
primaryStage.setScene(scene);
}
public static void main(String[] args) {
launch(args);
}
}
我的设计文件
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<BorderPane xmlns="http://javafx.com/javafx/8.0.121" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
<top>
<HBox prefHeight="100.0" prefWidth="200.0" BorderPane.alignment="CENTER">
<children>
<Button fx:id="buttonProducts" mnemonicParsing="false" onMouseClicked="#buttonProductsOnMouseClicked" text="Products" />
<Button fx:id="buttonNewProduct" mnemonicParsing="false" onMouseClicked="#buttonNewProductOnMouseClicked" text="New products">
<HBox.margin>
<Insets left="5.0" />
</HBox.margin></Button>
</children>
</HBox>
</top>
<center>
<Label text="Label" BorderPane.alignment="CENTER" />
</center>
</BorderPane>
Controller
设计文件的类
package sample;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
public class Controller {
@FXML
private Button buttonProducts;
@FXML
private Button buttonNewProduct;
public void buttonProductsOnMouseClicked(javafx.scene.input.MouseEvent mouseEvent) {
buttonProducts.setText("You have clicked on me!");
}
public void buttonNewProductOnMouseClicked(javafx.scene.input.MouseEvent mouseEvent) {
buttonNewProduct.setText("You have clicked on me!");
Main mainclass = new Main();
mainclass.changeScene("new_product/new_product.fxml");
}
}
解决方案
推荐阅读
- python - 将 mark_line 分层到交互式线图上会显着降低 Altair 的性能
- java - Class.class.getResourceAsStream 在 Eclipse 中返回 null 但在 jar 中有效
- c++ - 警告:对局部变量“l3”的引用返回 [-Wreturn-local-addr]
- javascript - 如何为同一个画布设置多个上下文?
- javascript - 需要在 JS 中调用的文件 URL 的末尾附加一个随机字符串或 int
- kubernetes - 是否有人使用用户提供的证书在 Kubernetes 上部署了 nifi(通过 nginx 保护)
- xml - 在 XMS 元素中定义键
- ios - 带锁的请求依赖
- sql - 计算事件之间的平均天数(无法聚合 b/c 使用的窗口函数)
- wordpress - 如何阻止循环影响主菜单?