gpt4 book ai didi

java - 如何使用 fx :id of a GridPane 通过controller.java 文件向 JavaFX gui 添加按钮

转载 作者:行者123 更新时间:2023-12-01 09:22:17 25 4
gpt4 key购买 nike

对 JavaFX 来说还是比较新的,我在将按钮添加到我设置的 GUI 中时遇到了一些麻烦。

我有 3 个文件:Main.java、Controller.java 和 example.fxml(每个文件位于下面)

根据我通过教程和文档阅读的内容,由于“fx:controller”部分,Controller.java 文件已加载并链接到 fxml 文件 - 但除此之外,我无法正确让程序运行该文件方法。

我尝试将 Main.java 设置为 Controller ,并以这种方式融合代码(被轰炸)。甚至主动违反形式并尝试在 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 - 实际上应该只是启动应用程序。 IE。它应该加载 FXML,将其放入窗口中,然后显示该窗口。 FXML 定义的 UI 的初始化和其他配置以及事件处理应由 Controller 完成。所以你并没有真正尝试从正确的位置执行这段代码。您应该从 Controller 执行此操作:

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 实例并从中获取 Controller 。您需要 Controller 来正确跟踪索引:

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

关于java - 如何使用 fx :id of a GridPane 通过controller.java 文件向 JavaFX gui 添加按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40097090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com