gpt4 book ai didi

java - 读取给父级后组合框卡住

转载 作者:行者123 更新时间:2023-12-01 08:48:31 24 4
gpt4 key购买 nike

这次我准备了一个例子:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;


public class testMain extends Application {

public static void main(String[] args) {
testMain.launch(args);
}

@Override
public void start(Stage primaryStage) throws Exception {

VBox root = new VBox(5);

root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(10, 5, 10, 5));

Scene scene = new Scene(root);

ComboBox<String> cb = new ComboBox<>();
cb.getItems().addAll("content 1" , "content 2", "content 3");

Label label = new Label("shows content");

cb.valueProperty().addListener((observable, oldValue, newValue) -> {

ComboBox<String> newCb = cb;
root.getChildren().clear();
Label newLabel = new Label(newValue);
root.getChildren().addAll(newLabel, cb);
});

root.getChildren().addAll(label, cb);
primaryStage.setScene(scene);
primaryStage.show();
}
}

在我的程序中,我根据保管箱中的选择向根添加了可变数量的 Vbox。这就是为什么我需要清除子列表并从头开始重建它(这是最简单的方法^^)。

问题是,组合框在第一次选择后卡住,有没有办法避免这种情况或使其再次工作?

最佳答案

这看起来像是一个错误。

也就是说,我强烈建议您不要以这种方式实现。例如,您可以使用组合框位于底部、VBox 位于中心的 BorderPane。然后重建VBox:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane ;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;


public class TestMain extends Application {

public static void main(String[] args) {
launch(args);
}

@Override
public void start(Stage primaryStage) throws Exception {


VBox vbox = new VBox(5);

vbox.setAlignment(Pos.CENTER);
vbox.setPadding(new Insets(10, 5, 10, 5));

BorderPane root = new BorderPane(vbox);

Scene scene = new Scene(root);

ComboBox<String> cb = new ComboBox<>();
root.setBottom(cb);

cb.getItems().addAll("content 1" , "content 2", "content 3");

Label label = new Label("shows content");

cb.valueProperty().addListener((observable, oldValue, newValue) -> {

vbox.getChildren().clear();
Label newLabel = new Label(newValue);
vbox.getChildren().addAll(newLabel);
});

vbox.getChildren().addAll(label);
primaryStage.setScene(scene);
primaryStage.show();
}
}

或者,根据您的设计,不要删除组合框:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.util.Arrays ;


public class testMain extends Application {

public static void main(String[] args) {
launch(args);
}

@Override
public void start(Stage primaryStage) throws Exception {

VBox root = new VBox(5);

root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(10, 5, 10, 5));

Scene scene = new Scene(root);

ComboBox<String> cb = new ComboBox<>();
cb.getItems().addAll("content 1" , "content 2", "content 3");

Label label = new Label("shows content");

cb.valueProperty().addListener((observable, oldValue, newValue) -> {

root.getChildren().removeIf(node -> node != cb);
Label newLabel = new Label(newValue);
root.getChildren().addAll(0, Arrays.asList(newLabel));
});

root.getChildren().addAll(label, cb);
primaryStage.setScene(scene);
primaryStage.show();
}
}

关于java - 读取给父级后组合框卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42535497/

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