2016-10-17 69 views
0

对于JavaFX还是比较新的,我在将按钮添加到GUI中时遇到了一些问题建立。如何通过controller.java文件使用GridPane的fx:id将按钮添加到JavaFX gui

我有3个文件:Main.java,Controller.java和sample.fxml(每下方)

从我通过教程和文档读取时,Controller.java文件被加载和链接到fxml文件,因为“fx:controller”部分 - 但除此之外,我无法正确地让程序运行该方法。

我已经尝试设置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> 
+0

你为什么要打电话从'Main'代码?只需在控制器中定义一个'initialize()'方法并从那里调用它。 –

回答

1

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(但同样,我不能强调这是真正使用工具包的方式与它所设计的模式相反),创建一个实例并从中获取控制器。你需要的控制器来追踪正确索引:

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); 
    } 
} 
+0

啊!谢谢,通过文档和各种其他来源,我一直发现“启动”方法被称为初始化。 今晚晚些时候会测试,谢谢! – ZenOokami

相关问题