Javafx 2 如何在JavaFX中使复选框或组合框只读

Javafx 2 如何在JavaFX中使复选框或组合框只读,javafx-2,readonly,Javafx 2,Readonly,如何在javaFX中使复选框/组合框只读,但不禁用 我尝试使用onAction事件,但无效 checkBox.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { event.consume(); } }); checkBox.setOnAction(新的EventHandler(){ @凌驾 公共无效句柄

如何在javaFX中使复选框/组合框只读,但不禁用

我尝试使用
onAction
事件,但无效

checkBox.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        event.consume();
    }
});
checkBox.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
event.consume();
}
});
使用下面代码中的所有事件都是可行的,但我认为这不是一个好的解决方案:

checkBox.addEventFilter(KeyEvent.ANY, new EventHandler<KeyEvent>() {
    @Override
    public void handle(KeyEvent event) {
        event.consume();
    }
});
checkBox.addEventFilter(MouseEvent.ANY, new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEventevent) {
        event.consume();
    }
});
checkBox.addEventFilter(KeyEvent.ANY,neweventhandler()){
@凌驾
公共无效句柄(KeyEvent事件){
event.consume();
}
});
checkBox.addEventFilter(MouseEvent.ANY,new EventHandler()){
@凌驾
公共无效句柄(MouseEventevent){
event.consume();
}
});

您可以用空的方法覆盖方法
复选框#arm()

    CheckBox cb = new CheckBox("hi") {
        @Override
        public void arm() {
            // intentionally do nothing
        }
    };

如果不想覆盖CheckBok类,可以使用selectedProperty

CheckBox cb = new CheckBox("hi");
cb.selectedProperty().addListener(new NCL());



class NCL implements ChangeListener<Boolean> {

        @Override
        public void changed(ObservableValue<? extends Boolean> ov, Boolean old_val, Boolean new_val) {
            cb.setSelected(false);
        }
    }
复选框cb=新复选框(“hi”);
cb.selectedProperty().addListener(新的NCL());
类NCL实现ChangeListener{
@凌驾

public void changed(observevalue您可以将复选框设置为disabled,但使用CSS设置其外观。如果您使用默认样式,则可以通过设置完全不透明度使复选框看起来“正常”

checkbox.setStyle("-fx-opacity: 1");

组合框的处理方式可能与此类似。

只读和禁用之间有什么区别?区别在于视觉、只读和正常具有相同的视觉效果。需要将控件设置为只读吗?控件用于控制,而不是指示。那么为什么TextField将方法设置为可编辑(false),它使文本字段成为只读?我需要一个解决方案,而不是一个理由。@AlexanderKirov,这对我来说是一个重要的用例。我对复杂视图投入了大量精力。事实上,很多视图都是如此。有时,该视图附加到用户可能不会更改的内容上。我不想创建一个完整的新视图来进行指示。相反,我希望我的视图o有一个只读模式,我可以随意控制。谢谢,但我使用FXML,所以过度隐藏复选框类不适合我。您可以创建一个自定义只读复选框,并在FXMLI中使用它。如果在语句必须是
cb.setSelected(false);
。我更改为
cb.setSelected(ov)
处理这两种情况,但第一次不起作用(第一次可以更改,第二次只能读取)太好了!太简单了,但很有用:)