英文:
how hide/show dynamically created nodes in javafx?
问题
我已动态创建了多个节点。现在,当单击特定节点时,必须查找该节点,它必须隐藏窗格中的所有其他节点。此外,当我再次单击它时,它应显示被隐藏的节点。
例如,在附加的图像中,单击根节点上的向下箭头图标,它必须隐藏所有其他节点,再次单击时,它必须显示隐藏的节点。
这是我创建按钮的方式。
Node_Basic_Event_Node anode = new Node_Basic_Event_Node(calcNode_Id("Basic_Event_Node"), "Basic_Event_Node", editorName, editorType); anode.relocate(50, 50); elementsContent.getChildren().add(anode);
现在,我如何在单击图像中的根节点的向下箭头图标时隐藏节点?我尝试了这段代码示例,但它隐藏了包括 "root node" 在内的所有节点。
Pane elementsContent = (Pane) getParent();
for (Node node : elementsContent.getChildren()) {
node.managedProperty().set(true);
node.setVisible(false);
}
英文:
I have created multiple nodes dynamically. Now, I have to find specific node when it is clicked, it must hide all other node in the pane. Also, When I click it again it should display the hidden node.
For example,In the attached image, the down-arrow icon on root node is clicked, it must hide all other nodes and when it is clicked second time, it must show the hidden nodes again.
This how I am creating the buttons.
Node_Basic_Event_Node anode = new Node_Basic_Event_Node(calcNode_Id("Basic_Event_Node"), "Basic_Event_Node", editorName, editorType); anode.relocate(50, 50); elementsContent.getChildren().add(anode);
Now, How I can hide nodes when clicking on root node's down-arrow icon in the image? I tried this sample of code but it is hiding all nodes including "root node"
Pane elementsContent = (Pane) getParent();
for (Node node : elementsContent.getChildren()) {
node.managedProperty().set(true);
node.setVisible(false);
}
答案1
得分: 1
我并不完全确定您的问题出在哪里,但我创建了一个小示例,希望能对您有所帮助。不应更改可见性的按钮(此处为特定文本)在每次被过滤时都会被排除。
package sample;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import java.util.Optional;
import java.util.Random;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
VBox vBox = new VBox();
Random random = new Random();
int randomIndex = random.nextInt(10);
String chosen = "The Chosen One", simple = "Simple Button";
for (int i = 0; i < 10; i++) {
Button button = new Button(simple);
if (i == randomIndex)
button.setText(chosen);
vBox.getChildren().add(button);
button.setOnAction(event -> {
Button clickedButton = (Button) event.getSource();
if (clickedButton.getText().equals(chosen)) {
// 保存普通按钮的可见性状态:
Optional<Boolean> visible = vBox.getChildren().stream()
.filter(node -> node instanceof Button)
.map(node -> (Button) node)
.filter(btn -> !btn.getText().equals(chosen))
.findFirst().map(Button::isVisible);
// 更改除被过滤的选定按钮外的其他按钮的可见性:
vBox.getChildren().stream()
.filter(node -> node instanceof Button)
.map(node -> (Button) node)
.filter(btn -> !btn.getText().equals(chosen))
.forEach(btn -> btn.setVisible(!btn.isVisible()));
// 更改(并不是那么)选中的按钮:
if (visible.isPresent() && !visible.get()) {
int nextIndex = random.nextInt(10);
for (int j = 0; j < vBox.getChildren().size(); j++) {
if (vBox.getChildren().get(j) instanceof Button) {
Button btn = (Button) vBox.getChildren().get(j);
if (j == nextIndex)
btn.setText(chosen);
else
btn.setText(simple);
}
}
vBox.requestFocus();
}
}
});
}
primaryStage.setScene(new Scene(vBox));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
英文:
I am not absolutly sure where your problem exactly is, but I created a small example which will hopefully help you. The button which should not change visibility (here: certain text) is simply filtered out every time.
package sample;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import java.util.Optional;
import java.util.Random;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
VBox vBox = new VBox();
Random random = new Random();
int randomIndex = random.nextInt(10);
String chosen = "The Chosen One", simple = "Simple Button";
for (int i = 0; i < 10; i++) {
Button button = new Button(simple);
if (i == randomIndex)
button.setText(chosen);
vBox.getChildren().add(button);
button.setOnAction(event -> {
Button clickedButton = (Button) event.getSource();
if (clickedButton.getText().equals(chosen)) {
// Save visibility status of the simple buttons:
Optional<Boolean> visible = vBox.getChildren().stream()
.filter(node -> node instanceof Button)
.map(node -> (Button) node)
.filter(btn -> !btn.getText().equals(chosen))
.findFirst().map(Button::isVisible);
// Change visibility of the buttons except the filtered chosen one:
vBox.getChildren().stream()
.filter(node -> node instanceof Button)
.map(node -> (Button) node)
.filter(btn -> !btn.getText().equals(chosen))
.forEach(btn -> btn.setVisible(!btn.isVisible()));
// Change the (not so) chosen one:
if (visible.isPresent() && !visible.get()) {
int nextIndex = random.nextInt(10);
for (int j = 0; j < vBox.getChildren().size(); j++) {
if (vBox.getChildren().get(j) instanceof Button) {
Button btn = (Button) vBox.getChildren().get(j);
if (j == nextIndex)
btn.setText(chosen);
else
btn.setText(simple);
}
}
vBox.requestFocus();
}
}
});
}
primaryStage.setScene(new Scene(vBox));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论