Javafx 删除几个相同的元素组合框
我有4个组合框,每个组合框中有5个元素:“1”、“1”、“2”、“3”、“4”。 如果在Javafx 删除几个相同的元素组合框,javafx,combobox,javafx-2,javafx-8,Javafx,Combobox,Javafx 2,Javafx 8,我有4个组合框,每个组合框中有5个元素:“1”、“1”、“2”、“3”、“4”。 如果在组合框中选择了项目“1”,则该项目将自动从其他项目中排除。如果在组合框中选择了项目“”,则必须在名称中进行设置 它会自动返回到另一个。因此,除了“.”之外,其他项目的需求相同。 我试着这么做这是代码: 如果您遵循当前的方法,那么您的代码将相当长,并且很难调试。目前看来: 您只删除项目,从不退还项目 不存储以前选择的值。想象一下,在您的第一个组合框中,选择了“1”(随后从其他组件中排除),您决定将其更改回“”
组合框
中选择了项目“1”,则该项目将自动从其他项目中排除。如果在组合框
中选择了项目“”,则必须在名称中进行设置
它会自动返回到另一个。因此,除了“.”之外,其他项目的需求相同。我试着这么做这是代码:
如果您遵循当前的方法,那么您的代码将相当长,并且很难调试。目前看来:
.getSelectedItem()
将只返回当前值,该值已经是“”public class JavaFXApplication extends Application {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage primaryStage) {
FlowPane root = new FlowPane();
ArrayList<String> items = new ArrayList<>();
Collections.addAll(items, " ", "1", "2", "3", "4");
List<ComboBox> comboBoxList = new ArrayList<>();
for (int i = 0; i < 4; i++) {
ComboBox c = new ComboBox(FXCollections.observableArrayList(items));
c.setValue(c.getItems().get(0));
c.valueProperty().addListener(removeFromOtherCombo(comboBoxList, c));
comboBoxList.add(c);
}
root.getChildren().addAll(comboBoxList);
Scene scene = new Scene(root, 200, 100);
primaryStage.setScene(scene);
primaryStage.show();
}
public static ChangeListener removeFromOtherCombo(List<ComboBox> boxes, ComboBox current) {
return (o, oldVal, newVal) -> {
if (newVal.equals(oldVal)) {
return;
}
if (!oldVal.equals(" ")) {
boxes.stream()
.filter(c -> !c.equals(current))
.forEach((ComboBox) -> {
ComboBox.getItems().add(oldVal);
});
}
if (!newVal.equals(" ")) {
boxes.stream()
.filter(c -> !c.equals(current))
.forEach((ComboBox) -> {
ComboBox.getItems().remove(newVal);
});
}
};
}
}
每当您选择新值时,ChangeListener
都会收到通知,幸运的是,它同时接收旧值和新值
如果旧值等于新值,那么我们就没什么可做的了
if (newVal.equals(oldVal)) {
return;
}
如果旧值是一个数字(例如,我们正在从“1”更改为“2”),那么我们必须将以前选择的数字返回到每个组合框
,但其中一个已过滤
if (!oldVal.equals(" ")) {
boxes.stream()
.filter(c -> !c.equals(current))
.forEach((ComboBox) -> {
ComboBox.getItems().add(oldVal);
});
}
当我们更改为一个数字时,也会采用相同的方法,但这次我们必须从每个
组合框中删除它,只有一个除外 首先,不要通过=
或比较字符串
=代码>,改为使用equals:vub1.getSelectionModel().getSelectedItem().equals(“”
@MBec OK i rewrite:?'如果(vub1.getSelectionModel().getSelectedItem().equals(“”){}else{'但是程序仍然给我一个例外你有一个索引自动边界异常
,所以检查你的循环是否只在列表的最大大小上迭代!我使用场景生成器和FXML文件并初始化组合框
,所以你能重写这部分代码:列表组合框列表=新的ArrayList();例如(int i=0;i<4;i++){ComboBox c=new ComboBox(FXCollections.observearraylist(items));c.setValue(c.getItems().get(0));c.valueProperty().addListener(removeFromOtherCombo(comboBoxList,c));comboBoxList.add(c);
然后更改此行ComboBox c=new ComboBox(FXCollections.observearraylist(items));
toComboBox c=comboBoxList.get(i);
并在循环开始之前将您的ComboBox
添加到列表中:comboBoxList.add(comboBox1)
等。在这种情况下,您可以使用foreach循环。好的,非常感谢我重写了自己的代码,但我一直是异常
s,因为我的程序应该自动选择组合框
的一个元素,但是复制您的代码会重写这些异常
s,我不会出现组合框的初始值de>为空。因为我不想处理它,所以我显式地将所选项目设置为第一个,如下:c.setValue(c.getItems().get(0));
。我在开始时使用您的代码初始化
,然后更改我的选择:公共无效初始化(){您的代码…q1vub1.getSelectionModel().clearAndSelect(q1cprvar1);q1vub2.getSelectionModel().clearAndSelect(q1cprvar2);q1vub3.getSelectionModel().clearAndSelect(q1cprvar3);q1vub4.getSelectionModel().clearAndSelect(q1cprvar4);
q1cprvar1
,q1cprvar2
和其他变量是程序在程序开始时读取文件的int
变量。因此,使用ActionListener
c.valueProperty().addListener(removeFromOtherCombo(comboBoxList, c));
if (newVal.equals(oldVal)) {
return;
}
if (!oldVal.equals(" ")) {
boxes.stream()
.filter(c -> !c.equals(current))
.forEach((ComboBox) -> {
ComboBox.getItems().add(oldVal);
});
}