【发布时间】:2017-03-23 18:59:47
【问题描述】:
我正在使用 JavaFx 编写一个项目,它是一个 3D-Tic Tac Toe,我有一个 3D 4*4*4 页面,我使用场景构建器 2.0 设计并放置了很多按钮作为控件,所以当你点击一个按钮,其文本变为“R”,当计算机选择其移动时,它将变为“B”,无论如何这里是我的控制器类的示例:
public class Controller {
@FXML
private Button b131;
@FXML
private Button b111;
@FXML
private Button b133;
@FXML
private Button b232;
@FXML
private Button b331;
@FXML
private Button b132;
@FXML
private Button b231;
@FXML
private Button b314;
@FXML
private Button b113;
@FXML
private Button b234;
@FXML
private Button b212;
@FXML
private Button b333;
@FXML
private Button b311;
...
@FXML
public void Initialize() {
assert b131 != null : "fx:id=\"b131\" was not injected: check your FXML file 'Scene.fxml'.";
assert b111 != null : "fx:id=\"b111\" was not injected: check your FXML file 'Scene.fxml'.";
assert b133 != null : "fx:id=\"b133\" was not injected: check your FXML file 'Scene.fxml'.";
assert b232 != null : "fx:id=\"b232\" was not injected: check your FXML file 'Scene.fxml'.";
assert b331 != null : "fx:id=\"b331\" was not injected: check your FXML file 'Scene.fxml'.";
assert b132 != null : "fx:id=\"b132\" was not injected: check your FXML file 'Scene.fxml'.";
assert b231 != null : "fx:id=\"b231\" was not injected: check your FXML file 'Scene.fxml'.";
assert b314 != null : "fx:id=\"b314\" was not injected: check your FXML file 'Scene.fxml'.";
assert b113 != null : "fx:id=\"b113\" was not injected: check your FXML file 'Scene.fxml'.";
assert b234 != null : "fx:id=\"b234\" was not injected: check your FXML file 'Scene.fxml'.";
assert b212 != null : "fx:id=\"b212\" was not injected: check your FXML file 'Scene.fxml'.";
assert b333 != null : "fx:id=\"b333\" was not injected: check your FXML file 'Scene.fxml'.";
assert b311 != null : "fx:id=\"b311\" was not injected: check your FXML file 'Scene.fxml'.";
assert b112 != null : "fx:id=\"b112\" was not injected: check your FXML file 'Scene.fxml'.";
assert b134 != null : "fx:id=\"b134\" was not injected: check your FXML file 'Scene.fxml'.";
assert b233 != null : "fx:id=\"b233\" was not injected: check your FXML file 'Scene.fxml'.";
assert b211 != null : "fx:id=\"b211\" was not injected: check your FXML file 'Scene.fxml'.";
assert b332 != null : "fx:id=\"b332\" was not injected: check your FXML file 'Scene.fxml'.";
assert b214 != null : "fx:id=\"b214\" was not injected: check your FXML file 'Scene.fxml'.";
assert b313 != null : "fx:id=\"b313\" was not injected: check your FXML file 'Scene.fxml'.";
assert b114 != null : "fx:id=\"b114\" was not injected: check your FXML file 'Scene.fxml'.";
assert b213 != null : "fx:id=\"b213\" was not injected: check your FXML file 'Scene.fxml'.";
assert b334 != null : "fx:id=\"b334\" was not injected: check your FXML file 'Scene.fxml'.";
assert b312 != null : "fx:id=\"b312\" was not injected: check your FXML file 'Scene.fxml'.";
assert b142 != null : "fx:id=\"b142\" was not injected: check your FXML file 'Scene.fxml'.";
assert b241 != null : "fx:id=\"b241\" was not injected: check your FXML file 'Scene.fxml'.";
assert b141 != null : "fx:id=\"b141\" was not injected: check your FXML file 'Scene.fxml'.";
assert b122 != null : "fx:id=\"b122\" was not injected: check your FXML file 'Scene.fxml'.";
assert b144 != null : "fx:id=\"b144\" was not injected: check your FXML file 'Scene.fxml'.";
assert b243 != null : "fx:id=\"b243\" was not injected: check your FXML file 'Scene.fxml'.";
assert b221 != null : "fx:id=\"b221\" was not injected: check your FXML file 'Scene.fxml'.";
assert b342 != null : "fx:id=\"b342\" was not injected: check your FXML file 'Scene.fxml'.";
assert b121 != null : "fx:id=\"b121\" was not injected: check your FXML file 'Scene.fxml'.";
assert b143 != null : "fx:id=\"b143\" was not injected: check your FXML file 'Scene.fxml'.";
...
我在这个逻辑中设置了我的按钮 fx:id,'b' 代表按钮,第一个整数是指它的页面,第二个和第三个整数代表该按钮的行和列,现在我的问题是事件处理,我已经编写了一个函数来执行此操作并通过场景构建器的代码部分将其连接到我的按钮并且它可以工作:
public void ButtonHandler(){
b111.setOnAction(new EventHandler<javafx.event.ActionEvent>() {
@Override
public void handle(javafx.event.ActionEvent event) {
b111.setText("R");
}
});
...
但我希望按钮名称有点动态,但我不知道如何有效地做到这一点。 任何帮助将不胜感激。
【问题讨论】:
-
也许最好不要在 FXML 中创建这些按钮。创建窗格以容纳它们以及 FXML 中的其他控件,然后在 Java 代码中创建和添加按钮。这样你就可以使用循环和数组等。
-
@fabian 的链接答案非常好:尽管使用 64 个按钮,它可能会让你的理智变得更加清醒。
-
创建一个窗格并迭代 for 循环所需的次数并创建一次按钮。我也会减少 LOC 及其最佳实践。