gpt4 book ai didi

java - 如何在 Javafx 和 Scene Builder 中使用一个事件处理程序方法管理多个按钮

转载 作者:行者123 更新时间:2023-11-30 06:12:33 25 4
gpt4 key购买 nike

我有 14 对按钮,与两组文本字段关联,这些文本字段将其关联的文本字段递增和递减 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;
}
}

最佳答案

经过一番尝试,我想出了一个解决方案。请记住,这是我使用 Scene Builder、FXML 和 JavaFX 坚持 MVC 架构的尝试。

有 14 种不同的盘子,7 磅和 7 公斤。每个板都有一个文本字段,用于显示给定重量的杠铃上需要加载的每个板的数量。这些文本字段存储在 ObservableLists 中,并在 Controller 的其他位置提供监听器。

// textFields associated with 45, 35, 25, 15, 10, 5, 2.5lb plates
ObservableList<TextField> poundTextFieldList = FXCollections.observableArrayList();
// textFields associated with 25, 20, 15, 10, 5, 2.5, 1.25kg plates
ObservableList<TextField> kilogramTextFieldList = FXCollections.observableArrayList();

这些数组存储板的数量。

int[] poundPlatesToLoad = calculator.getPoundPlatesToLoad();
int[] kilogramPlatesToLoad = calculator.getKilogramPlatesToLoad();

这些ArrayList存储增量按钮

private final ArrayList<Button> poundIncrementButtons = new ArrayList();
private final ArrayList<Button> poundDecrementButtons = new ArrayList();
private final ArrayList<Button> kilogramIncrementButtons = new ArrayList();
private final ArrayList<Button> kilogramDecrementButtons = new ArrayList();

由于我使用 Scene Builder 来设计 GUI,因此每个按钮都需要 @FXML 标签来识别它们。我认为没有办法解决这个问题,因此 Controller 中有 28 个。

@FXML
private Button poundIncrement45Button;
@FXML
private Button poundDecrement45Button;

然后,为了避免编写 28 个处理程序,我编写了与每个 ArrayList 关联的 4 个处理程序。

public void poundIncrementButtonPressed(ActionEvent event) {
System.out.println("pound increment button pressed");
Button button = (Button) event.getSource();
// identifies which plate is to be incremented
int plate = poundIncrementButtons.indexOf(button);
incrementDecrementPlate(0, 0, plate);
}

还有另一种方法来增加或减少正确的文本字段。

private void incrementDecrementPlate(int unit, int incrementDecrement, int textField) {

int oldValue;
if(unit == 0){
oldValue = (int) poundPlatesToLoad[textField];
} else {
oldValue = (int) kilogramPlatesToLoad[textField];
}

String incremented;
String decremented;

if (oldValue % 2 != 0) {
incremented = Integer.toString(oldValue + 1);
} else {
incremented = Integer.toString(oldValue + 2);
}

if (oldValue % 2 != 0) {
decremented = Integer.toString(oldValue - 1);
} else if (oldValue != 0) {
decremented = Integer.toString(oldValue - 2);
} else {
decremented = Integer.toString(oldValue);
}

switch (unit) {
case 0:
if (incrementDecrement == 0) {
poundTextFieldList.get(textField).setText(incremented);
} else {
poundTextFieldList.get(textField).setText(decremented);
}
break;
case 1:
if (incrementDecrement == 0) {
kilogramTextFieldList.get(textField).setText(incremented);
} else {
kilogramTextFieldList.get(textField).setText(decremented);
}
break;
}
}

这是迄今为止该程序的图像。每个文本字段都会动态响应更改。右侧的杠铃显示公斤板以响应文本字段中的变化。

Barbell Math

关于java - 如何在 Javafx 和 Scene Builder 中使用一个事件处理程序方法管理多个按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49911812/

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