Javafx 2 使用控制器更改与单选按钮一起使用的css文件

Javafx 2 使用控制器更改与单选按钮一起使用的css文件,javafx-2,scenebuilder,Javafx 2,Scenebuilder,好的,这是我第一次使用Javafx和Scene Builder,但我遇到了一个无法解决的问题 基本上,我正在制作一个应用程序,其中包括一个设置选项卡,用户可以使用单选按钮更改应用程序的颜色主题(即带有浅色背景的浅色主题、按钮、选项卡、文本字段等)。因此,如果用户单击“light”单选按钮,它应该加载“light”css文件,如果选择了“dark”单选按钮,它应该更改为使用“dark”css文件,等等 在控制器类中,我有以下内容: @FXML RadioButton rbtnLight; @FXM

好的,这是我第一次使用Javafx和Scene Builder,但我遇到了一个无法解决的问题

基本上,我正在制作一个应用程序,其中包括一个设置选项卡,用户可以使用单选按钮更改应用程序的颜色主题(即带有浅色背景的浅色主题、按钮、选项卡、文本字段等)。因此,如果用户单击“light”单选按钮,它应该加载“light”css文件,如果选择了“dark”单选按钮,它应该更改为使用“dark”css文件,等等

在控制器类中,我有以下内容:

@FXML
RadioButton rbtnLight;
@FXML
public void colourThemeLight(javafx.event.ActionEvent event)
{ 
 if (rbtnLight.isSelected() == true)
    {
        System.out.println("I'm the chosen button");
        //I'm using println at the moment to test that it's actually recognizing the action performed
    }
}

 @FXML
RadioButton rbtnDark;
 @FXML
public void colourThemeDark(javafx.event.ActionEvent event)
{ 
 if (rbtnDark.isSelected() == true)
    {
        System.out.println("I'm the other chosen button");
        //Again, I'm using println at the moment to test that it's actually recognizing the action performed
    }
}
File file = new File("path");
String css1 = file.toString();
mainS.getStyleClass().add(css1); //mainS being the main screen in sceneBuilder which everything is placed on
但它给出了一个“RuntimeException:java.lang.reflect.InvocationTargetException” 由
if(rbtnLight.isSelected()=true)
if(rbtnLight.isSelected()=true)
语句处的NullPointerException引起

我还尝试使用了
rbtnLight.isDisabled()==false
.isPressed()==true
但是两者都给出了相同的错误。 或者,我尝试了
if(event.getSource()==rbtnTLightS)
,但实际上没有任何作用。没有错误,但也没有消息

在场景生成器中,我已将样式表加载到主窗口,而不是“设置”选项卡中的单个单选按钮

(差不多完成了……)

如果这样做成功,我将如何加载正确的css文件?我找到了一种方法,如下所示:

@FXML
RadioButton rbtnLight;
@FXML
public void colourThemeLight(javafx.event.ActionEvent event)
{ 
 if (rbtnLight.isSelected() == true)
    {
        System.out.println("I'm the chosen button");
        //I'm using println at the moment to test that it's actually recognizing the action performed
    }
}

 @FXML
RadioButton rbtnDark;
 @FXML
public void colourThemeDark(javafx.event.ActionEvent event)
{ 
 if (rbtnDark.isSelected() == true)
    {
        System.out.println("I'm the other chosen button");
        //Again, I'm using println at the moment to test that it's actually recognizing the action performed
    }
}
File file = new File("path");
String css1 = file.toString();
mainS.getStyleClass().add(css1); //mainS being the main screen in sceneBuilder which everything is placed on
但我怀疑这是否有效

如果您能提供任何帮助,我们将不胜感激。对于这篇文章,我深表歉意:)

编辑:完成堆栈跟踪-

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1770)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1653)
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.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:8390)
at javafx.scene.control.ToggleButton.fire(ToggleButton.java:256)
at javafx.scene.control.RadioButton.fire(RadioButton.java:113)
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.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:3758)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3486)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2495)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:350)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:275)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$350(GlassViewEventHandler.java:385)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$$Lambda$257/436071628.get(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:404)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:384)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:927)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$145(WinApplication.java:101)
at com.sun.glass.ui.win.WinApplication$$Lambda$36/1963387170.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
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:497)
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:497)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1765)
... 59 more
Caused by: java.lang.NullPointerException
at settings.FXMLDocumentController.colourThemeLight(FXMLDocumentController.java:75)
... 69 more
我发布的加载不同css文件的方法有效吗

没有

将不起作用,因为getStyleClass()接受CSS样式表文件中定义的CSS选择器,而不是其路径或名称

应该是

mainS.getStyleSheets().add(css1);

请参阅。

能否添加完整的堆栈跟踪?从您发布的内容来看,我认为,
rbtnLight
仍然是空的,您将得到一个
NullPointerException
@ItachiUchiha Added:)请确保FXML文件中的单选按钮具有正确的fx:id。@UlukBiy啊,废话。。。外汇:我再次得到我。。。别忘了它。现在它已经识别了一个动作,我发布的加载不同css文件的方法是否有效?还是我把它添加到了错误的项目中?哇,谢谢!我在root.getChildren()上遇到了一个错误,
error:getChildren()在父级中具有受保护的访问权限
my Parent是一个拆分窗格。我已经读到这可能是一个原因,但我没有一个边框窗格作为一个选项来包装它,并将其放入锚点,网格或堆栈窗格似乎也不起作用。建议?@Grey,对于splitpane,它应该是root.getItems()。请参阅拆分窗格javadoc。