[英]Javafx 2.0 How-to Application.getParameters() in a Controller.java file
[英]How to add buttons to a JavaFX gui via the controller.java file using the fx:id of a GridPane
对于JavaFX来说,它还是一个相对较新的东西,在将按钮添加到已设置的GUI时遇到了一些麻烦。
我有3个文件:Main.java,Controller.java和sample.fxml(每个文件位于下面)
根据“教程”和“文档”中的内容,由于“ fx:controller”部分,已加载Controller.java文件并将其链接到fxml文件,但除此之外,我无法正常运行该方法的程序。
我尝试将Main.java设置为控制器,并以这种方式(炸弹)融合代码。 甚至积极地反对这种形式,并尝试在Main.java文件中创建Controller.java的新实例(实质上只是在程序运行时加载的实例旁边创建另一个实例),而且也遭到了轰炸。
有指针吗?
Main.java
package soundboardEoZ;
import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class Main extends Application {
int sound_index = 1;
int target = 10;
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
while (sound_index < target){
// This is where I want to call the addButton() method from Controller.java
sound_index++;
}
}
public static void main(String[] args) {
launch(args);
}
}
Controller.java
package soundboardEoZ;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
public class Controller {
int index = 2;
int target = 10;
@FXML
GridPane button_grid;
void test(){
System.out.println("Testing");
}
void addButton(){
Button sound_button = new Button("Button_" + index);
button_grid.add(sound_button, index,2);
}
}
还有我们的FXML文件
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.SeparatorMenuItem?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Text?>
<!--VBox is a single column panel-->
<?import javafx.scene.text.Font?>
<VBox id="vbox" prefHeight="400" prefWidth="1000" xmlns="http://javafx.com/javafx/8.0.76-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="soundboardEoZ.Controller">
<MenuBar fx:id="menuBar"> <!--Literally a MenuBar-->
<menus> <!--Holds the menu concept for the bar-->
<Menu text="File"> <!--Menu holds Items-->
<items>
<MenuItem text="New" />
<MenuItem text="Open" />
<SeparatorMenuItem />
<MenuItem text="Save Settings" />
<SeparatorMenuItem />
<MenuItem text="Settings" />
</items>
</Menu>
<Menu text="Edit">
<items>
<MenuItem text="Copy" />
</items>
</Menu>
<Menu text="About">
<items>
<MenuItem text="Team" />
</items>
</Menu>
<Menu text="Help">
<items>
<MenuItem text="Guide" />
<MenuItem text="Forums" />
</items>
</Menu>
</menus>
</MenuBar>
<Pane>
<GridPane>
<Button GridPane.columnIndex="0">I'm another Test</Button>
<Text fill="RED" stroke="BLACK" strokeWidth="2.0" GridPane.columnIndex="1">
<font><Font size="25"/></font>
Testing
</Text>
</GridPane>
</Pane>
<GridPane fx:id="button_grid" hgap="10" vgap="10" xmlns:fx="http://javafx.com/fxml">
<!--<Button GridPane.columnIndex="0" GridPane.rowIndex="1">Hello!</Button>-->
<!--<Button GridPane.columnIndex="1">Hiya!</Button>-->
<!--<Text text="Clickity!" GridPane.columnIndex="0" GridPane.rowIndex="0" GridPane.columnSpan="2" />-->
<!--<Label text="Configuration Name:" GridPane.columnIndex="0" GridPane.rowIndex="1" />-->
<!--<TextField GridPane.columnIndex="1" GridPane.rowIndex="1" />-->
<!--<Button fx:id="test_button" text="Hello"></Button>-->
</GridPane>
</VBox>
该Application
子类- Main
在你的榜样-真的应该只是启动应用程序。 即,它应该加载FXML,将其放在窗口中并显示该窗口。 由FXML定义的UI的初始化和其他配置以及事件处理应由控制器完成。 因此,您并不是真正要从正确的位置执行此代码。 您应该只从控制器执行此操作:
package soundboardEoZ;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
public class Controller {
int index ;
int target = 10;
@FXML
GridPane button_grid;
public void initialize() {
for (index = 2; index < target ; index++) {
addButton();
}
}
public void test(){
System.out.println("Testing");
}
public void addButton(){
Button sound_button = new Button("Button_" + index);
button_grid.add(sound_button, index,2);
}
}
然后从Main
删除所有这些功能:
package soundboardEoZ;
import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
如果您真的想从Main
调用该方法(但是,再次强调一下,我实际上是在以与设计方式相反的方式使用工具箱),请创建一个FXMLLoader
实例并从中获取控制器它。 您将需要控制器正确跟踪索引:
package soundboardEoZ;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
public class Controller {
int index = 2;
@FXML
GridPane button_grid;
public void test(){
System.out.println("Testing");
}
public void addButton(){
Button sound_button = new Button("Button_" + index);
button_grid.add(sound_button, index,2);
index++;
}
}
然后您可以执行以下操作:
package soundboardEoZ;
import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class Main extends Application {
int sound_index = 1;
int target = 10;
@Override
public void start(Stage primaryStage) throws Exception{
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
Parent root = loader.load();
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
Controller controller = loader.getController();
while (sound_index < target){
controller.addButton();
sound_index++;
}
}
public static void main(String[] args) {
launch(args);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.