java - javaFX 复选框和组合框

标签 java javafx checkbox combobox

我想找出通过一种方法检查了哪些复选框以及取消了哪些复选框。 此外,我想知道如何在 ChomboBox 中添加标签,例如有数字可供选择,1-9 为“弱”标题,10-20 为“强”标题,但只能从数字中选择,不能从标题中选择。

感谢您的建议

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.text.Font;

import java.net.URL;
import java.util.ResourceBundle;

public class Controller implements Initializable {
    public Label l1,l2,l3,l4,l5,l6,l7,l8;
    public Button generovatB;
    public TextField jtxt1;
    public ComboBox cbox1;
    public CheckBox cb1,cb2,cb3,cb4,cb7;
    public Font x2;
    public ImageView imgvBck;
    //created by Z.K. =
    private char[] lower = {'a','b','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    private char[] upper = {'A','B','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    private char[] special = {'#','&','@','{','}','[',']','+','-','*','/','?','.',':','!','§',')','(','/','%','=',';','<','>','ß','$'};
    private char[] numbers = {'1','2','3','4','5','6','7','8','9','0'};
    private String[] words = new String[1000];



    public void generovatB(ActionEvent actionEvent) {


    }


    public void naplnPole(){


}

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        Image pozadi = new Image("obr.png",650,500,true,false,false);
        imgvBck.setImage(pozadi);
        ObservableList<String> options =
                FXCollections.observableArrayList("5","7","9","15","18"
                );
        cbox1.setItems(options);

    }
}

最佳答案

可能我不确定,但如果我正确理解你的问题,你想将组合框中的数字与标题分组,并让用户使用复选框选择它们。您还可以找到选择了哪些号码。

如果这是您的问题,正如 @Daniel 建议您必须使用 ListCell 来修改单元格中的内容。首先,我建议组合框有一个单独的模型来处理选择。与检查所选项目的所有复选框相比,这将使事情更容易处理。

class Level {
        private IntegerProperty level = new SimpleIntegerProperty();
        private BooleanProperty selected = new SimpleBooleanProperty();
        ...
}

要实现 CheckBox,您可以使用 CheckBoxListCell,但由于您需要额外的要求来显示组标题,因此这可能不正确。因此,我建议根据要求创建自定义单元工厂。

// Implementing with CheckBoxListCell
Callback<ListView<Level>, ListCell<Level>> forListView = CheckBoxListCell.forListView(Level::selectedProperty);
comboBox.setCellFactory(forListView);

您需要考虑的另一个步骤是关闭单击任何单元格时弹出窗口的自动隐藏功能。这将允许您在不关闭弹出窗口的情况下进行多项选择。

final ComboBox<Level> comboBox = new ComboBox<Level>(items) {
            protected javafx.scene.control.Skin<?> createDefaultSkin() {
                return new ComboBoxListViewSkin<Level>(this) {
                    @Override
                    protected boolean isHideOnClickEnabled() {
                        return false;
                    }
                };
            }
        };

要查找选定的数字,您所要做的就是循环遍历组合框中的项目并检查模型的选定值。

comboBox.getItems().stream().filter(Level::isSelected).forEach(selectedItem->{
      // Do with your selected item
});

考虑到上述所有内容,下面是根据我对问题的理解的一个工作演示。 enter image description here

import com.sun.javafx.scene.control.skin.ComboBoxListViewSkin;
import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Callback;

import java.util.stream.Collectors;

public class HeadingInComboBoxDemo extends Application {

    private final int WEAK_INDEX = -1;
    private final int STRONG_INDEX = -2;

    @Override
    public void start(Stage stage) throws Exception {
        VBox root = new VBox();
        root.setSpacing(15);
        root.setPadding(new Insets(25));
        root.setAlignment(Pos.TOP_LEFT);
        Scene sc = new Scene(root, 600, 600);
        stage.setScene(sc);
        stage.show();

        final ObservableList<Level> items = FXCollections.observableArrayList();
        for (int i = 1; i < 11; i++) {
            if (i == 1) {
                items.add(new Level(WEAK_INDEX));
            } else if (i == 6) {
                items.add(new Level(STRONG_INDEX));
            }
            items.add(new Level(i));
        }

        final ComboBox<Level> comboBox = new ComboBox<Level>(items) {
            protected javafx.scene.control.Skin<?> createDefaultSkin() {
                return new ComboBoxListViewSkin<Level>(this) {
                    @Override
                    protected boolean isHideOnClickEnabled() {
                        return false;
                    }
                };
            }
        };
        comboBox.setPrefWidth(150);
        comboBox.setItems(items);
        comboBox.setCellFactory(new Callback<ListView<Level>, ListCell<Level>>() {
            @Override
            public ListCell<Level> call(ListView<Level> param) {
                return new ListCell<Level>() {
                    private CheckBox cb = new CheckBox();
                    private BooleanProperty booleanProperty;

                    {
                        cb.setOnAction(e->getListView().getSelectionModel().select(getItem()));
                    }
                    @Override
                    protected void updateItem(Level item, boolean empty) {
                        super.updateItem(item, empty);
                        if (!empty) {
                            if (item.getLevel() == WEAK_INDEX || item.getLevel() == STRONG_INDEX) {
                                Label lbl = new Label(item.getLevel() == WEAK_INDEX ? "Weak" : "Strong");
                                lbl.setStyle("-fx-font-size:14px;-fx-font-weight:bold;");
                                setGraphic(lbl);
                                setText(null);
                            } else {
                                if (booleanProperty != null) {
                                    cb.selectedProperty().unbindBidirectional(booleanProperty);
                                }
                                booleanProperty = item.selectedProperty();
                                cb.selectedProperty().bindBidirectional(booleanProperty);
                                setGraphic(cb);
                                setText(item.getLevel() + "");
                            }
                        } else {
                            setGraphic(null);
                            setText(null);
                        }
                    }
                };
            }
        });

        comboBox.setButtonCell(new ListCell<Level>() {
            @Override
            protected void updateItem(Level item, boolean empty) {
                super.updateItem(item, empty);
                String selected = comboBox.getItems().stream().filter(i -> i.isSelected())
                        .map(i -> i.getLevel()).sorted()
                        .map(i -> i + "").collect(Collectors.joining(","));
                setText(selected);
            }
        });

        Text txt = new Text();
        Button show = new Button("Show Selected");
        show.setOnAction(e->{
            StringBuilder sb = new StringBuilder();
            comboBox.getItems().stream().filter(Level::isSelected).forEach(item->{
                sb.append(item.getLevel()).append("\n");
            });
            txt.setText(sb.toString());
        });

        root.getChildren().addAll(comboBox,show,txt);
    }

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

    class Level {
        private IntegerProperty level = new SimpleIntegerProperty();
        private BooleanProperty selected = new SimpleBooleanProperty();

        public Level(int level) {
            setLevel(level);
        }

        public int getLevel() {
            return level.get();
        }

        public IntegerProperty levelProperty() {
            return level;
        }

        public void setLevel(int level) {
            this.level.set(level);
        }

        public boolean isSelected() {
            return selected.get();
        }

        public BooleanProperty selectedProperty() {
            return selected;
        }

        public void setSelected(boolean selected) {
            this.selected.set(selected);
        }
    }
}

关于java - javaFX 复选框和组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52467979/

相关文章:

java - 在 JavaFX 中使用 Google map 和街景 View

JavaFX Maven jfx :jar error: Could not find artifact javafx-packager

jquery - Angular2如何获取所有选中的复选框

JavaScript 调用并将参数发送到 JNLP 文件

java - Groovy 编译期间出现 StackOverflowError

java - 使用 jersey 的 java Restful Web 服务出现 404 错误

java - 使用 Apache POI 处理 docx 文件中的复选框

java - 如何使用具有加密属性的 Google Guice?

java - JavaFX 2D 游戏中的对象动画

javascript - 我需要 javascript checkboxes.click(function()) 在页面首次加载时启动