【发布时间】:2018-04-19 02:31:04
【问题描述】:
我有 14 对按钮与两组 textFields 相关联,它们将其关联的 textFields 递增和递减 2。每个文本字段显示要在杠铃上加载多少对特定重量的板。 它们存储在两个二维数组中,一个用于磅,另一个用于千克。 [递增或递减][按钮]
final Button[][] poundIncrementDecrementButton = new Button[2][7];
final Button[][] kilogramIncrementDecrementButton = new Button[2][7];
我正在使用 Scene Builder 和 JavaFX,并且试图避免编写 28 个 @FXML 事件处理程序。 到目前为止,这是我想出的遍历每个数组的方法,但我不确定如何替换 lambda 表达式以使其工作。
// assigns event handlers to increment and decrement buttons.
private void incrementDrecimentButtonEventHandlers() {
// p=1 increment buttons, p=2 decrement buttons
for (int p = 0; p < poundIncrementDecrementButton.length; p++) {
// loops through buttons
for (int j = 0; j < poundIncrementDecrementButton[p].length; j++) {
Button incrementButton = poundIncrementDecrementButton[p][j];
final int incrementDecriment = p;
final int textField = j;
incrementButton.setOnAction((ActionEvent event) -> {
incrementDecrementPlate("pounds", incrementDecriment, textField);
});
}
// k=1 increment buttons, k=2 decrement buttons
for (int k = 0; k < kilogramIncrementDecrementButton.length; k++) {
// loops through buttons
for (int j = 0; j < kilogramIncrementDecrementButton[k].length; j++) {
Button incrementButton = kilogramIncrementDecrementButton[k][j];
final int incrementDecriment = k;
final int textField = j;
incrementButton.setOnAction((ActionEvent event) -> {
incrementDecrementPlate("kilograms", incrementDecriment, textField);
});
}
}
}
}
然后我让事件处理程序使用相关索引调用此方法。
// increments or decrements the plates
private void incrementDecrementPlate(String unit, int incrementDecrement, int textField) {
Double oldValue = Double.parseDouble(poundTextFieldList.get(textField).getText());
String incremented;
String decremented;
if (oldValue % 2 != 0) {
incremented = Double.toString(oldValue + 1);
} else {
incremented = Double.toString(oldValue + 2);
}
if (oldValue % 2 != 0) {
decremented = Double.toString(oldValue - 1);
} else if (oldValue != 0) {
decremented = Double.toString(oldValue - 2);
} else {
decremented = Double.toString(oldValue);
}
switch (unit) {
case "pounds":
if (incrementDecrement == 0) {
poundTextFieldList.get(textField).setText(incremented);
} else {
poundTextFieldList.get(textField).setText(decremented);
}
break;
case "kilograms":
if (incrementDecrement == 0) {
kilogramTextFieldList.get(textField).setText(incremented);
} else {
kilogramTextFieldList.get(textField).setText(decremented);
}
break;
}
}
【问题讨论】:
-
这似乎需要很多代码来做一些可以用更少的代码编写的事情。
-
似乎完全用 Java 来完成 UI 布局和事件处理的这一部分要容易得多 - 与拥有 FXML 相比,您已经发布的代码只需要很少的额外代码包含 28 个(或 56 个?)
<Button>元素和 14 个文本字段元素的文件... -
看来您是手动进行的,这是可能的,但从长远来看,JavaFX 方法是最好的。在代码中创建 UI 控件,使用 Controller,Buttons 设置属性,TextFields 观察属性。基本知识 - 查看 Oracle JavaFX 教程
-
@Siraj 这正是我正在做的。所有这些代码都位于我的控制器类中。我使用 Scene Builder 来设计 UI。我正在尝试尽可能地坚持 MVC。
标签: java javafx fxml scenebuilder actionevent