【发布时间】:2020-06-20 12:14:27
【问题描述】:
您好,您在下面看到的代码是基于火车预订系统界面的,我包含了一个名为 addCustomer 的方法,它会提示一个文本字段来请求客户名称(Hashmap Key),然后在提交名称后,然后投影座位按钮,允许客户选择其姓名下的多个座位,所选座位号存储为客户姓名的键值。座位容量限制为 42 个座位。
[界面如下:IMAGE 但是设置 Hashmap 是我的主要问题,它只为每个客户名称存储一个座位号。
public static final int SEATING_CAPACITY = 42;
public static void addCustomer(Button[] viewBtn, GridPane pane, int[] keep, TextField tf, HashMap customerBooked, Button submit) {
pane.setVgap(10);
pane.setHgap(35);
pane.setPadding(new Insets(10, 10, 10, 280));
submit.setOnAction(event -> {
int i = 0;
for (int y = 1; y <= 14; y++) {
for (int x = 1; x <= 3; x++) {
i++;
String num = "" + i;
i--;
viewBtn[i] = new Button(num);
viewBtn[i].setId("Seat " + i);
viewBtn[i].setDisable(true);
pane.add(viewBtn[i], x, y);
viewBtn[i].setMaxSize(50, 150);
viewBtn[i].setDisable(false);
if (keep[i] == 1) {
viewBtn[i].setStyle("-fx-background-color: red;");
} else {
viewBtn[i].setStyle("-fx-background-color: #03fc98;");
int finalI = i;
viewBtn[i].setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
viewBtn[finalI].setStyle("-fx-background-color: red;");
keep[finalI] = 1;
String name = new String(tf.getText());
customerBooked.put(name, viewBtn[finalI]);
}
});
}
i++;
}
}
});
System.out.println(customerBooked);
}
当我开始打印 Hashmap 时,我注意到这种情况发生了,例如,当我输入 Sam 的名字并单击以下按钮时,座位为 24、27、33。它最终占据了最后一个座位。
{Sam=Button[id=Seat 32, styleClass=button]'33'}
除此之外,按钮样式和座位 ID 也被放置到我不想考虑的座位值。
我需要修复它,使它看起来像下面的那样。这样我可以将它调整为我的其他方法,例如按名称搜索客户座位或根据名称删除。
{Sam='24','27','33',Jane='25'}
【问题讨论】:
-
你为什么使用
new String(...)?我几乎每天都看到,但这对任何事情都没有好处。在 Java 中,所有变量都是引用,因此您可以简单地引用现有字符串而不是复制它。如有必要,垃圾收集器会自动将对象移动到另一个内存区域。您不必害怕从本地堆栈返回对象。 -
请阅读 java 基础知识,尤其是 Map 的特性。
标签: java arrays user-interface javafx hashmap