作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想找出通过一种方法检查了哪些复选框以及取消了哪些复选框。此外,我想知道如何在 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
});
考虑到上述所有内容,下面是根据我对问题的理解的一个工作演示。
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/
我是一名优秀的程序员,十分优秀!