java - Can't instantiate class fields in JavaFX project -
so i'm trying move swing javafx , declare start() , launch() methods without knowing how work. below code prints false , false console. when click button in gui, built scene builder, executes mymethod(), time prints true. why primarystage isn't instantiated?
addition information: made class controller, same reason - needs access stage reference. full version of main, didn't post, implements initializable if matters.
as bonus question wondering if need field of primarystage reference application stage, there 1 of?, in mymethod().
public class main extends application { private stage primarystage; public void start(stage primarystage) { this.primarystage = primarystage; try { scene scene = new scene(fxmlloader.load(getclass().getresource("sample.fxml")),600,400); primarystage.setscene(scene); } catch(exception e) { e.printstacktrace(); } primarystage.show(); //both lines below print false; should. system.out.println(this.primarystage == null); mymethod(); } public static void main(string[] args) { launch(args); } public void mymethod() { system.out.println(primarystage == null); } } edit
placing fxml document in same folder above class let run main see button indeed print true.
<?xml version="1.0" encoding="utf-8"?> <?import javafx.scene.control.*?> <?import java.lang.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.layout.anchorpane?> <hbox xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.main"> <children> <button mnemonicparsing="false" onaction="#mymethod" text="button" /> </children> </hbox>
that because fxmlloader create new instance of application.main class, in start() method not invoked , private stage primarystage null.
it better separate main class , controller fxml, , pass primary stage later if necessary:
... try { fxmlloader loader = new fxmlloader( getclass().getresource( "sample.fxml" ) ); scene scene = new scene( loader.load(), 600, 400 ); ( (mycontroller) loader.getcontroller() ).setprimarystage(primarystage); primarystage.setscene( scene ); } catch ( exception e ) { e.printstacktrace(); } ... where mycontroller class can simple as:
public class mycontroller { private stage primarystage; public void setprimarystage(stage primarystage) { this.primarystage = primarystage; } } but can implement initializable interface. refer introduction fxml :: controllers.
also note can scene , stage node part of constructed scene graph (i.e. stage shown) by:
scene scene = anynode.getscene(); stage primarystage = (stage) anynode.getscene().getwindow(); of course, secondary stages created getwindow() return stage , not primary stage.
Comments
Post a Comment