简体   繁体   English

无法执行控制器类中的按钮样式方法(FXML按钮)。 如何设置FXML按钮的样式而不为此使用CSS?

[英]Can't execute button style methods (FXML button) from controller class. How can I setstyles of a FXML button and not using CSS for this?

I can't set the style of a button simply within an if-then-statement or a method. 我不能仅在if-then语句或方法中设置按钮的样式。

It compiles well but gives an error when running the application. 它可以很好地编译,但是在运行应用程序时会出错。 The idea is to color a button when the parameter "setnrColor" is equal to 7. The button is assigned with the @FXML label. 想法是在参数“ setnrColor”等于7时给按钮着色。该按钮分配有@FXML标签。 The logic works well when I do not use the setStyle / setTextFill methods referring to the button. 当我不使用引用按钮的setStyle / setTextFill方法时,逻辑工作良好。

When running, I get the following error: Exception in thread "JavaFX Application Thread" java.lang.NullPointerException. 运行时,出现以下错误:线程“ JavaFX Application Thread” java.lang.NullPointerException中的异常。 This occurs when the "setstyle methode is being called. 当调用“ setstyle方法时,会发生这种情况。

A simple explanation saying it is not possible would make sense. 一个简单的解释说这是不可能的,这是有道理的。 With all my searches so far I didn't got this answer though. 到目前为止,我的所有搜索都没有得到这个答案。 Any help is appreciated. 任何帮助表示赞赏。

public class FXMLDocumentController implements Initializable {

@FXML private Label label; 
@FXML private Button btn;
@FXML private TextField text;
private int NrColor; 

public void setButtonColor (int setnrColor){

boolean bln1;

NrColor = setnrColor;

if(NrColor==7){ //Expression is of type boolean
System.out.println("SAME NUMBER: SET COLOR BUTTON TO BLACK");
//btn.setStyle("-fx-base:black;"); //THIS LINE DOESNT WORK
bln1 = true; 
//btn.getStyleClass().remove("armed");
}  
else {
System.out.println("DIFFERENT NUMBER: SET COLOR BUTTON TO RED");
//btn.setStyle("-fx-base:red;"); //DOESNT WORK
bln1 = false; 
trigger();

}

System.out.println("OUTPUT =" + bln1);

}


java.lang.NullPointerException:
at test_issue.FXMLDocumentController.trigger(FXMLDocumentController.java:64)
at test_issue.FXMLDocumentController.setButtonColor(FXMLDocumentController.java:53)
at test_issue.FlashingLight.lambda$start$1(FlashingLight.java:25)
at com.sun.scenario.animation.shared.TimelineClipCore.visitKeyFrame(TimelineClipCore.java:239)
at com.sun.scenario.animation.shared.TimelineClipCore.playTo(TimelineClipCore.java:180)
at javafx.animation.Timeline.impl_playTo(Timeline.java:176)
at javafx.animation.AnimationAccessorImpl.playTo(AnimationAccessorImpl.java:39)
at com.sun.scenario.animation.shared.FiniteClipEnvelope.timePulse(FiniteClipEnvelope.java:124)
at javafx.animation.Animation.impl_timePulse(Animation.java:1102)
at javafx.animation.Animation$1.lambda$timePulse$25(Animation.java:186)
at java.security.AccessController.doPrivileged(Native Method)
at javafx.animation.Animation$1.timePulse(Animation.java:185)
at com.sun.scenario.animation.AbstractMasterTimer.timePulseImpl(AbstractMasterTimer.java:344)
at com.sun.scenario.animation.AbstractMasterTimer$MainLoop.run(AbstractMasterTimer.java:267)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:506)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$404(QuantumToolkit.java:319)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)

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

<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="test_issue.FXMLDocumentController">
<children>
<Label fx:id="label" layoutX="126" layoutY="120" minHeight="16" minWidth="69" />
<Button fx:id="btn" layoutX="104.0" layoutY="72.0" mnemonicParsing="false" prefHeight="56.0" prefWidth="136.0" text="Button" />
<TextField fx:id="text" layoutX="41.0" layoutY="14.0" promptText="HALLO" />
</children>
</AnchorPane>

you shouldn't create objects of your controller class, you need to extract if from the loader: 您不应该创建控制器类的对象,需要从加载程序中提取以下内容:

FXMLLoader loader = new FXMLLoader(getClass().getResource("/main.fxml"));
AnchorPane root = loader.load();

FXMLDocumentController controller = loader.getController();
controller.setButtonColor(...);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM