【发布时间】:2021-11-04 22:22:04
【问题描述】:
我想在 javafx 的 GUI 中模拟数组元素的交换。
我有一个网格窗格Memory,它就像一个数组。网格的第 1 行只有数组。
在每一行/列中,我添加了一个具有图像视图和标签的堆栈窗格。
我想更改当前节点及其下一个节点的图像视图。连同数据。
我尝试通过循环执行此操作,但未看到结果。 所以我使用了一个线程来进行背景图像交换,但这不允许交换标签值。 这是我在更改背景时没有交换的最接近的结果。
public void insertFront() {
System.out.println("InsertList before insert "+ insertList.size()+" : "+insertList);
if (insertList.size() == 0){
ObservableList<Node> nodes = insertArr[0].getChildren();
Label temp = (Label) nodes.get(1);
insertList.add(random.nextInt(999));
temp.setText(""+insertList.get(0));
} else {
if (insertList.size() < max) {
new Thread(()->{
for (int i = insertList.size()-1; i >= 0; i--) {
ObservableList<Node> currNodes = insertArr[i].getChildren();
ImageView temp = (ImageView) currNodes.get(0);
temp.setImage(current);
ObservableList<Node> nextNodes = insertArr[i+1].getChildren();
ImageView tempNext = (ImageView) nextNodes.get(0);
tempNext.setImage(next);
Label tempLabel = (Label) currNodes.get(1);
Label tempNextLabel = (Label) nextNodes.get(1);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
temp.setImage(allocated);
tempNext.setImage(allocated);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
for (int i = insertList.size()-1; i >= 0; i--) {
ObservableList<Node> currNodes = insertArr[i].getChildren();
ObservableList<Node> nextNodes = insertArr[i+1].getChildren();
Label tempLabel = (Label) currNodes.get(1);
Label tempNextLabel = (Label) nextNodes.get(1);
tempNextLabel.setText(tempLabel.getText());
tempLabel.setText("");
}
ObservableList<Node> nodes = insertArr[0].getChildren();
Label temp = (Label) nodes.get(1);
insertList.add(0, random.nextInt(999));
temp.setText("" + insertList.get(0));
} else {
insertList.removeAll(insertList);
fillInsert();
insertFront();
}
}
System.out.println("InsertList after insert "+ (insertList.size())+" : "+insertList);
}
但这没有同步。我试图实现的是至少先显示背景的交换,然后直接更新行。 但是因为线程没有同步,所以转换很慢并且网格行被更新了。
我需要帮助至少同步线程,以便首先显示转换。然后行被改变。
【问题讨论】:
-
设计说明:您应该为此使用
javafx.animationAPI,而不是线程。 -
@Slaw 你能做一个演示吗?我是 javafx 的初学者。谢谢。
-
更多帮助请发帖minimal reproducible example
标签: java multithreading javafx stackpanel gridpane