复选框和组合框javaFX [英] Checkbox and ComboBox javaFX

查看:71
本文介绍了复选框和组合框javaFX的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想找出一种方法选中了哪些复选框,而未选中这些复选框.此外,我想了解如何在ChomboBox中添加标签,例如有数字可供选择,从1-9的标题为弱",从10-20的标题为强",但是您只能从数字中选择,而不能从标题中选择.

i'd like to find out, which CheckBoxes are checked and which are unchecked by one method. Furthermore, i'd like to find out how can i add label in ChomboBox, E.G. there are numbers to choose, and from 1-9 there is heading "weak",from 10-20 there is heading "strong", but you can choose only from numbers and not from headings.

感谢您的任何建议

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);

    }
}

推荐答案

可能不确定,但是如果我正确理解了您的问题,则希望将组合框中的数字与标题分组,然后让用户使用复选框选择它们.另外,您还可以找到选择的号码.

May be I am not sure, but if I understand your question correctly, you want to group the numbers in the combo box with a heading, and let the user to select them using checkboxes. And also you to find which numbers are selected.

如果这是您的问题,如@Daniel所建议,您必须使用ListCell来修改单元格中的内容.首先,我建议组合框有一个单独的模型来处理选择.这将比通过检查所有CheckBox选定项的操作容易得多.

If this is your question, as @Daniel suggested you have to use a ListCell to modify the content in the cell. Firstly, I would recommend to have a separate model for the combo box to handle the selection. This would make things much easier to handle than checking through all CheckBoxes for the selected items.

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

要实现CheckBox,可以使用CheckBoxListCell,但是由于需要额外的条件来显示组标题,因此可能无法正确设置.因此,我建议根据需求创建自定义单元工厂.

For implementing CheckBox, you can go with CheckBoxListCell but as you need an extra requirement to show the group heading, this may not suite correctly. So I would suggest to create custom cell factory for the requirements.

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

您需要考虑的另一步骤是在单击任何单元格时关闭弹出窗口的自动隐藏功能.这样一来,您无需关闭弹出窗口即可进行多项选择.

Another step you need to consider is to turn off the auto hide feature of popup on click of any cell. This will allow you to do multiple selection without closing the pop up.

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中的项目并检查模型的选定值.

To find the selected numbers, all you have to do is loop through the items in the ComboBox and check the selected value of the model.

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

考虑到以上所有内容,根据我对问题的理解,以下是一个有效的演示.

Considering all the above, below is a working demo as per my understanding of the question.

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);
        }
    }
}

这篇关于复选框和组合框javaFX的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆