- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
刚开始使用JavaFx(通常也是java的初学者),几天来我一直在尝试让它工作,但我一直无法解决它。我收到一个空指针异常,我知道这里涵盖了该异常: What is a NullPointerException, and how do I fix it?
所以我希望这个问题不会因为重复而被关闭,因为我知道 npe 是什么并且(通常)知道如何解决这个问题。
我也知道(大多数时候)如何躲避它们和/或修复它们(如果发生),但在这种情况下我只是不知道如何解决它。
我还检查了一些有关 fxml 的其他问题,但仍然无法弄清楚。
How to change CenterPane from LeftPane in javaFx borderPane?
switching between panes in BorderPane in javaFX
Loading new fxml in the same scene
在我的应用程序中,我希望有一个 borderpane 作为根,在左侧有三个按钮,根据我按下的按钮,带有 tabpane 的新 fxml 应该在我按下时加载在 borderpane 的中心我得到的按钮是一个 npe,我认为这是因为我没有引用正确的 borderpane,但我看不出哪里出错了。
我想做的是,当我按下 custMenuButton 按钮时,fxml 应该加载并设置为边框 Pane 的中心。
主类
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class Main extends Application {
@FXML
private BorderPane root;
Stage window;
@Override
public void start(Stage primaryStage) throws IOException {
window = primaryStage;
FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindowView.fxml"));
this.root = loader.load();
MainWindowController mwc = new MainWindowController();
mwc.setMain(this);
Scene scene = new Scene(root);
window.setTitle("JavaFX");
window.setScene(scene);
window.show();
}
public static void main(String[] args) {
launch(args);
}
public BorderPane getBorderPane() {
return root;
}
}
主窗口 Controller
import java.io.IOException;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.control.TabPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
public class MainWindowController {
private Main main;
@FXML private BorderPane root;
@FXML private VBox sideBox;
@FXML private Button custMenuButton;
@FXML private Button accMenuButton;
@FXML private Button transMenuButton;
public void setMain(Main main) {
this.main = main;
}
public void handleCustMenuButton() throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("CustomerView.fxml"));
TabPane pane = (TabPane) loader.load();
CustomerViewController cvc = loader.getController();
cvc.setMain(main);
main.getBorderPane().setCenter(pane);
}
}
客户 View Controller
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
public class CustomerViewController implements Initializable {
Main main;
@FXML private TabPane custTabPane;
@FXML private Tab createTab;
@FXML private Tab listAllTab;
@FXML private Tab deleteTab;
public void setMain(Main main){
this.main = main;
}
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}
主窗口 View
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="firstfx.MainWindowController">
<top>
<MenuBar BorderPane.alignment="CENTER">
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem mnemonicParsing="false" text="Close" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Help">
<items>
<MenuItem mnemonicParsing="false" text="About" />
</items>
</Menu>
</menus>
</MenuBar>
</top>
<left>
<VBox fx:id="sideBox" prefHeight="200.0" prefWidth="150.0" spacing="2.0" BorderPane.alignment="CENTER">
<children>
<Button fx:id="custMenuButton" mnemonicParsing="false" onAction="#handleCustMenuButton" prefHeight="50.0" prefWidth="130.0" text="Kundmeny" />
<Button fx:id="accMenuButton" mnemonicParsing="false" prefHeight="50.0" prefWidth="130.0" text="Kontomeny" />
<Button fx:id="transMenuButton" mnemonicParsing="false" prefHeight="50.0" prefWidth="130.0" text="Transaktioner" />
</children>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</VBox>
</left>
</BorderPane>
客户查看fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.layout.AnchorPane?>
<TabPane fx:id="custTabPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" tabClosingPolicy="UNAVAILABLE" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="firstfx.CustomerViewController">
<tabs>
<Tab fx:id="createTab" text="Skapa kund">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
</content>
</Tab>
<Tab fx:id="listAllTab" text="Lista alla kunder">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
</content>
</Tab>
<Tab fx:id="deleteTab" text="Radera kund">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
</content>
</Tab>
</tabs>
</TabPane>
堆栈跟踪
Executing /home/garnbutik/NetBeansProjects/FirstFX/dist/run1223809748/FirstFX.jar using platform /home/garnbutik/jdk1.8.0_151/jre/bin/java
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$353(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)
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at com.sun.glass.ui.gtk.GtkApplication.lambda$null$48(GtkApplication.java:139)
at java.lang.Thread.run(Thread.java:748)
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:1771)
... 48 more
Caused by: java.lang.NullPointerException
at firstfx.MainWindowController.handleCustMenuButton(MainWindowController.java:31)
... 58 more
BUILD STOPPED (total time: 4 minutes 14 seconds)
最佳答案
您不会在加载 MainWindowView.fxml
时创建的 Controller 上调用 setMain(...)
。因此,当您尝试执行以下操作时,在 MainWindowController
中
main.getBorderPane()...
出现空指针异常。
在您的 start()
方法中,您需要以与稍后在 handleCustMenuButton(...)
中相同的方式获取 Controller ,即
FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindowView.fxml"));
this.root = loader.load();
// MainWindowController mwc = new MainWindowController();
MainWindowController mwc = loader.getController();
mwc.setMain(this);
关于java - 在 borderpane 中心加载新的 fxml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48425065/
是否可以更改 BorderPane 区域的区域(左、右、上、下)的默认大小?如果顶部和底部改变高度以及顶部和底部宽度? 最佳答案 我猜你的意思是“在上下高度变化的情况下以及左右宽度变化的情况下?” 似
我正在尝试按照 Oracle 提供的教程自学基本的 JavaFX。 在 BorderPane 教程 ( https://docs.oracle.com/javafx/2/layout/builtin_
我有这个代码(简化/缩短/伪): StackPane background = new StackPane(); GridPane overlay = new GridPane(); BorderPa
我有两个类。一个 Main 类和一个 Chart 类。我的 Chart 类扩展了 PieChart 并在其构造函数中实例化了饼图。我的主类创建一个 BorderPane,然后实例化 Chart 类的一
我有子 GridPane,我想如果文本会增加,那么文本应该不会跳出 gridPane,而是跳出 ScrollPane,我不想看到 Apple 文本跳出框外。 @Override public vo
我在父布局 BorderPane 的左侧位置使用 VBox。我想使用一个 css 文件来更改和使用包含我的 VBox 的 BorderPane 左侧的图像背景。我的 ccs 文件中有以下内容,但无法使
是否可以在 BorderPane 上设置节点之间的间距? ? Swing 等效项将是 BorderLayout 上的 hgap 和 vgap . 我在文档中没有找到任何内容,我能想到的唯一可行的解
我在 BorderPane(的中心)内遇到 FlowPane 的奇怪行为。 如果我放大或缩小窗口的宽度,一切都很好。导致这种效果的只是一个狭窄的宽度 +- 5 个像素。重现代码: public cla
所以我有一个文本节点,我想将其放置在场景的右上角。大多数方法都声明要使用 BorderPane,但在我的情况下,场景中的一些其他节点正在使用 Pane,它也是我的根 Pane ,因此明显的解决方法是添
我有一个 BorderPane,其中心有一个 Canvas,并且我希望在更改 Canvas 大小时,BorderPane 始终环绕 Canvas 。以这段代码为例: public class Test
我希望创建一个以控件为中心的 GUI。因此,我使用 VBox 垂直排列它们,并使用 BorderPane 将其居中。但是,它并没有按照我想象的方式工作,而是将标签放置在窗口的右角。 import ja
我目前正在 JavaFX 中开发一个项目,并且正在使用 BorderPane 制作 GUI。我已经成功创建了菜单和 Accordion ,并将它们添加到我想要的位置(顶部和右侧)。 现在我创建了一个扩
这段代码: import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.geometry.I
我的 Java 水平为中级,对 JavaFX 还很陌生。我正在开发一个在 JavaFX 8 中使用 BorderPane 的应用程序。BorderPane 底部有两个按钮。 我想将按钮放置/对齐 Bo
对 JavaFX 非常陌生,我正在关注 simple tutorial here我创建了一个新的 JavaFX 项目,但它默认有一个 BorderPane,而不是教程中所说的 StackPane,所以
我想以编程方式在 BorderPane 中添加和删除侧面菜单。问题是当我添加 Node 时,它不可见。BorderPane 和 StackPane 在 FXML 文件中定义。 我想做这样的事情: St
我正在尝试使用文本字段在 JavaFX 中编写一个简单的数独界面,但是当我尝试生成网格时,它根本不显示。我认为 fxml 文件可能有问题,但我不知道是否有必要。 我尝试使用 Gluon SceneBu
每当我编译程序时,我都会收到此错误: java.lang.reflect.InitationTargetException 当我将 BorderPane 的内部节点(HBox)设置为底部时,会发生该错
我在学习教程时遇到此错误: javafx.fxml.LoadException: BorderPane is not a valid type. /C:/Users/Eduardo%20Abr
我在 Scene 上有一个 BorderPane 。& 我在该 Pane 中有一个背景图像。我对该图像的代码: BorderPane B_pane = new BorderPane(); Image
我是一名优秀的程序员,十分优秀!