gpt4 book ai didi

JavaFX 更新 ComboBox 项目列表以根据可更改的输入禁用某些项目

转载 作者:行者123 更新时间:2023-12-02 13:40:22 24 4
gpt4 key购买 nike

我正在开发预订系统的界面。在一个窗口中,我需要获取所需预订的开始时间和预订结束时间,以便检查数据库该插槽是否可用。 (只有 hh:mm 感兴趣,我在其他地方度过了这一天)。组合框如下所示:

//startTime HBox
HBox startTime = new HBox();
startTime.setSpacing(5);
final ComboBox startHours = new ComboBox(hours);
final ComboBox startMinutes = new ComboBox(minutes);
final Label colon = new Label(":");
startTime.getChildren().addAll(startHours,colon,startMinutes);

endTime 是一样的(具有相同组件的 HBox 只是更改了变量名称

我希望我的 startTime 小时组合框自动禁用那些高于当前 endTime 组合框小时的项目,反之亦然,我希望禁用低于 startTime 小时组合框的 endTime 小时项目。我尝试过创建一个单元工厂,但是如果我在编辑其他组合框之前打开组合框,它就不起作用。

startHours.setCellFactory(
new Callback<ListView<String>, ListCell<String>>() {
@Override
public ListCell<String> call(ListView<String> param) {
final ListCell<String> cell = new ListCell<String>() {

@Override public void updateItem(String item,
boolean empty) {
super.updateItem(item, empty);
if (item!=null){
setText(item);
}
if ((endHours.getValue()!=null) && (endHours.getValue().toString().compareTo(item)<0)){
setDisable(true);
setStyle("-fx-background-color: #ffc0cb");
}
}
};
return cell;
}
});

最佳答案

您的单元格需要观察另一个组合框中的值,以便它知道在该值发生变化时更新其禁用状态。

请注意,单元实现中还存在其他错误:您必须考虑 updateItem() 中的所有可能性方法:例如您没有正确处理为空的项目(单元格为空),或者在需要时将禁用状态设置回 false。最后,在这里使用字符串作为数据类型既不方便(您可能必须在某些时候转换回整数才能使用这些值),又会扰乱逻辑(例如,因为“10”小于“2”)。您应该使用ComboBox<Integer>在这里。

这是一个仅包含两个“小时”组合框的实现:

import java.util.function.BiPredicate;

import javafx.application.Application;
import javafx.beans.value.ObservableValue;
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.control.ListCell;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;


public class DependentComboBoxes extends Application {

private ComboBox<Integer> startHours ;
private ComboBox<Integer> endHours ;

@Override
public void start(Stage primaryStage) {
startHours = new ComboBox<>();
endHours = new ComboBox<>();
startHours.setCellFactory(lv -> new StartHoursCell());
endHours.setCellFactory(lv -> new EndHoursCell());
for (int i = 0; i < 24 ; i++) {
startHours.getItems().add(i);
endHours.getItems().add(i);
}

GridPane root = new GridPane();
root.setHgap(5);
root.setVgap(5);
root.addRow(0, new Label("Start hours:"), startHours);
root.addRow(1, new Label("End hours:"), endHours);

root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(20));
primaryStage.setScene(new Scene(root));
primaryStage.show();
}

private class StartHoursCell extends ListCell<Integer> {

StartHoursCell() {
endHours.valueProperty().addListener((obs, oldEndHours, newEndHours) -> updateDisableState());
}

@Override
protected void updateItem(Integer hours, boolean empty) {
super.updateItem(hours, empty);
if (empty) {
setText(null);
} else {
setText(hours.toString());
updateDisableState();
}
}

private void updateDisableState() {
boolean disable = getItem() != null && endHours.getValue() != null &&
getItem().intValue() > endHours.getValue();
setDisable(disable) ;
setOpacity(disable ? 0.5 : 1);
}
}

private class EndHoursCell extends ListCell<Integer> {

EndHoursCell() {
startHours.valueProperty().addListener((obs, oldEndHours, newEndHours) -> updateDisableState());
}

@Override
protected void updateItem(Integer hours, boolean empty) {
super.updateItem(hours, empty);
if (empty) {
setText(null);
} else {
setText(hours.toString());
updateDisableState();
}
}

private void updateDisableState() {
boolean disable = getItem() != null && startHours.getValue() != null &&
getItem().intValue() < startHours.getValue();
setDisable(disable) ;
setOpacity(disable ? 0.5 : 1);

}
}

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

关于JavaFX 更新 ComboBox 项目列表以根据可更改的输入禁用某些项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42764919/

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