Como criar Listenners para os CheckBox em uma ListView no JavaFX?

Recentemente eu aprendi a usar checkbox dentro de uma listview, porem eu preciso checar quando a pessoa seleciona a checkbox, pretendo que na 2 vez que a pessoa selecionar a checkbox vai ser bloqueada e ela não poderá selecionar novamente e também não poderá selecionar esse item na listview (meio que um disable)

Eu usei esse código para colocar as checkbox

private static class ListEntry {

    private BooleanProperty selected;
    private StringProperty text;



    public ListEntry(String text) {
        this.selected = new SimpleBooleanProperty();
        this.text = new SimpleStringProperty(text);
    }

    public BooleanProperty selectedProperty() {
        return selected;
    }

    public StringProperty textProperty() {
        return text;
    }

    @Override
    public String toString() {
        return textProperty().get();
    }
}

Para preencher (eu puxo direto do banco de dados) eu uso esse procedimento:

private void listFill(){
    ObservableList<ListEntry> items = FXCollections.observableArrayList();
    lvJogadoresTime.setCellFactory(
            CheckBoxListCell.forListView(ListEntry::selectedProperty)
    );

    for (int n1 = 0; n1 < ConsultasAvaliacao.jogadoreS.size(); n1++){
        items.add(new ListEntry(ConsultasAvaliacao.jogadoreS.get(n1)));
    }

    lvJogadoresTime.setItems(items);

    lvJogadoresTime.itemsProperty().addListener(c -> new ChangeListener<ListEntry>(){

        //Aki é onde estou tentando fazer o evento da checkbox ,porem nao funciona
        //Não apresenta erros no console apenas não funciona
        @Override
        public void changed(ObservableValue<? extends ListEntry> observable, ListEntry oldValue, ListEntry newValue) {
            System.out.println("Selected ? " + newValue.selected + " player " + newValue.text);
        }
    });

}

Como eu deixei escrito no código:

@Override
        public void changed(ObservableValue<? extends ListEntry> observable, ListEntry oldValue, ListEntry newValue) {
            System.out.println("Selected ? " + newValue.selected + " player " + newValue.text);
        }
    });

Eu tentei esse procedimento ^ para criar o evento para a checkbox, porém não funciona, por favor me ajudem.

suaListView.getSelectionModel().selectedItemProperty()
        .addListener(new ChangeListener<SuaClasse>() {
          public void changed(ObservableValue<? extends SuaClasse> observable,               
               System.out.println("selection changed");  
          }
});

Não funcionou não amigão

lvJogadoresTime.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<ListEntry>() {
        @Override
        public void changed(ObservableValue<? extends ListEntry> observable, ListEntry oldValue, ListEntry newValue) {
            System.out.println("Mudou o valor");
        }
    });

Aparentemente está sendo ativado só quando eu seleciono o item, não a checkbox em si, eu quero que cheque quando ele seleciona a checkbox sem precisar selecionar o item da list view

e mesmo sem selecionar a checkbox esta sendo ativado

O Item que voce se refere no exemplo seria o texto a direita do quadradinho ?

O “item” que eu quero bloquear é tudo, o texto e o quadradinho, porém quero checar toda vez que a pessoa selecionar o quadradinho, na 2 vez que ele selecionar eu vou bloquear ele poder apertar no quadrinho e no texto

Veja se e’ mais ou menos isso que você quer.

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventType;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBar;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class ListView2 extends Application {

    private int count = 0 ;
    
    private int count_geral = 0;
    Data data_control = null;
    
    @Override
    public void start(Stage primaryStage) {
        ListView<Data> listView = new ListView<>();

        Button addButton = new Button("Adiciona");
        addButton.setOnAction(e -> listView.getItems().add( new Data(false,"Ola Mundo"+ (++count) ) ) );
        

        Button deleteButton = new Button("Delete");
        deleteButton.setOnAction(e -> listView.getItems().remove(listView.getSelectionModel().getSelectedIndex()));
        deleteButton.disableProperty().bind(listView.getSelectionModel().selectedItemProperty().isNull());
 
        
        listView.setCellFactory(lv -> {
            
            ListCell<Data> cell = new ListCell<Data>() {
            
                public CheckBox cb = new CheckBox();
                
                @Override
                protected void updateItem(Data item, boolean empty) {
                    
                    super.updateItem(item, empty);
                     
                    if(item != null) {
                        
                       cb.setText(item.txt);
                       setGraphic(cb);
                       
                       cb.setOnMouseClicked(e -> {                      
                            if(data_control != item ) {
                                data_control = item;
                                count_geral = 0;
                            }
                            
                            count_geral++; 
                            
                            if(count_geral == 2) {
                                if(item.on == true) {
                                   item.on = false;                                  
                                }else {
                                   item.on = true;                                 
                                }
                                // listView.getSelectionModel().select(item);                                
                                count_geral = 0;
                            }   
                            cb.setSelected(item.on);                                  
                             
                       }); 
                      
                       
                    }else {
                       setGraphic(null);
                    }
                }
            };
             
            return cell;
        });
        
         
         
        BorderPane root = new BorderPane(listView);
        ButtonBar buttons = new ButtonBar();
        buttons.getButtons().addAll(addButton, deleteButton);
        root.setBottom(buttons);


        Scene scene = new Scene(root, 600, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
    
    
    public class Data {
        int count = 0;
        boolean on = false;
        String txt=null;
        
        public Data(boolean on, String txt) {
           this. on = on; 
           this.txt = txt;
        }
    }
}

Bons Codigos

Creio que é isso, vou testar Aki e depois te aviso, okay

É que não tou em casa agora

Bem meu amigo, ele ainda esta permitindo apertar 2 vezes, na verdade esta engraçado, aperto 1 vez nao acontece nada, aperto 2 vezes ele seleciona a chebkox, depois preciso apertar 2 vezes para deslecionar

Mais valeu, eu usei oque voce me falou e arrumei do meu jeito, obrigado mesmo amigão, vou deixar o código nesse comentário caso alguém precisar

public class Data {
    int count = 0;
    boolean on = false;
    String txt = null;

    public Data(boolean on, String txt) {
        this.on = on;
        this.txt = txt;
    }
}

private void listFill(){

    for (int n1 = 0;n1 < ConsultasAvaliacao.jogadoreS.size();n1++){
        lvJogadoresTime.getItems().add(new Data(false,ConsultasAvaliacao.jogadoreS.get(n1)));
    }

    lvJogadoresTime.setCellFactory(lv -> {

        ListCell<Data> cell = new ListCell<Data>() {

            public CheckBox cb = new CheckBox();

            @Override
            protected void updateItem(Data item, boolean empty) {

                super.updateItem(item, empty);

                if(item != null) {

                    cb.setText(item.txt);
                    setGraphic(cb);

                    cb.setOnMouseClicked(e -> {
                        if(data_control != item ) {
                            data_control = item;
                        }

                        if (item.count < 2){
                            item.count = item.count + 1;
                            if(item.count == 2){
                                cb.setSelected(false);
                                setDisable(true);
                            }
                        }

                    });


                }else {
                    setGraphic(null);
                }
            }
        };

        return cell;
    });
1 curtida