Verificar seleção de CheckBox dentro de uma tableview

Tenho uma table que carrega os dados de uma tabela dados de um db

 @FXML private TableView<Dados> tabelaPessoa;
    @FXML private TableColumn<Dados, Long> tbcolId;
    @FXML private TableColumn<Dados, String> tbcolNome;
    @FXML private TableColumn<Dados, Boolean> tbcolPresenca;

//metodo carrega banco na tabela
public void carregaTabela() {
   tbcolId.setCellValueFactory(new PropertyValueFactory("id"));
   tbcolNome.setCellValueFactory(new PropertyValueFactory("nome"));
   tbcolPresenca.setCellFactory(CheckBoxTableCell.forTableColumn(tbcolPresenca));
   tabelaPessoa.setItems(atualiza());
}

//metodo carrega banco na tabela
public ObservableList<Dados> atualiza() {
   Mysql msql = new Mysql();
   return FXCollections.observableArrayList(msql.getList());
}

Preciso verificar se o checkbox de cada linha da coluna presença está selecionado ou não.
Alguém pode me ajudar? Não estou conseguindo fazer esta verificação.

Explica melhor o que deseja fazer.
1.Você quer verificar a CkeckBox apos clicar em determinada linha da TableView?
2.Obter os resultados depois da TableView montada?
3.Sua TableView é apenas de apresentação ou tem edição tambem?

Enfim…

Obrigado pela resposta.
Quero verificar a checkbox, ao selecionar a checkbox, se estiver marcada retorna true, se não estiver marcada retorna false.
Vou criar uma condição caso a checkbox retorne true ou false.
A tabela não tem edição.
Estou usando javafx.

 tabelaPessoa.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> {
            Dados dados = tabelaPessoa.getSelectionModel().getSelectedItem();
            System.out.println(dados.getNome() + " presenca =  " + dados.getPresenca() );
 });

Obrigado pela resposta
esta retornando certinho. Na verdade perguntei errado.
O retorno seria quando clico na coluna presença e não na linha inteira.

Veja essas sugestões

tabelaPessoa.addEventHandler( MouseEvent.MOUSE_CLICKED, event -> {
            
           TablePosition pos = tabelaPessoa.getSelectionModel().getSelectedCells().get(0);
           int row = pos.getRow();     
           
           Dados dados = tabelaPessoa.getItems().get(row);

           TableColumn col = pos.getTableColumn();
           if(col != null) {
                if( col.textProperty().get().equals("Presenca") )  {                 
                    System.out.println(col.textProperty().get()  + " column=" +  pos.getColumn() );
                }
           }   
});

Outra sugestão é individualizar o Evento dentro de uma determinada Celula.

tbcolPresenca.setCellFactory(column -> {
            return new TableCell<Dados, Boolean>() {
                
                CheckBox check = new CheckBox("");
                
                { 
                   check.setDisable(true);
                   this.setOnMouseClicked( (e) -> {
                        Dados dados = table.getSelectionModel().getSelectedItem(); 
                        System.out.println(dados.getNome() + " presenca =  " + dados.getPresenca() );
                   } );
                        
                } 
                @Override
                protected void updateItem(Boolean item, boolean empty) {
                    super.updateItem(item, empty);
                    if (item == null || empty) {                        
                        setText(null);
                        setGraphic(null);
                        
                    } else {
                        setText("");                        
                        check.setSelected(item);                 
                        setGraphic(check);
                    }
                }
            };
        });

Obrigado pelas respostas
Na verdade queria o evento do isSelected do CheckBox.
if(checkBox.isSelected){
retorna true
}else{
retorna false
}
Não precisa atualizar o banco. Atraves da seleção queira executar outro metodo para enviar dados a outra tabela.
mas não acho esse evento dentro da tableview.
seu exemplo retira o checkbox da tableview e sempre retorna true.
Agradeço pela atenção.

return checkBox.isSelected();

No exemplo que te passei somente vai retornar true se for true.

Do mais parece-me meio confuso o que de fato voce quer fazer.

Se quer dar um clique dentro de uma celula e esta contem um CheckBox, então apos
esse clique o Dados especifico daquela linha é retornado como no exemplo que te passei, então basta comparar se (dados.getPresenca() == <true|false>), já no exemplo dois que está comentado nesse exemplo, veja que tem um um evento this.setOnMouseClicked, nele tambem você pode comparar o resultado do retorno da linha Dados

Veja esse exemplo se esta fazendo o que voce deseja. Basta clicar em Atleta e ver o println

import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TablePosition;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.CheckBoxTableCell;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
 /*from   w  w  w.  ja va 2  s. c o  m*/
public class TableViewTest extends Application {
 
    private final TableView<Person> table = new TableView<>();
    private final ObservableList<Person> data =
            FXCollections.observableArrayList(new Person("A", "B", false));
    final HBox hb = new HBox();
 
    public static void main(String[] args) {
        launch(args);
    }
 
    @Override
    public void start(Stage stage) {
        Scene scene = new Scene(new Group());
        stage.setWidth(450);
        stage.setHeight(550);
 
 
        TableColumn firstNameCol = new TableColumn("Nome");
        firstNameCol.setMinWidth(100);
        firstNameCol.setCellValueFactory(
                new PropertyValueFactory<>("firstName"));
 
        TableColumn lastNameCol = new TableColumn("Sobrenome");
        lastNameCol.setMinWidth(100);
        lastNameCol.setCellValueFactory(
                new PropertyValueFactory<>("lastName"));
        
        TableColumn<Person,Boolean> atletaCol = new TableColumn("Atleta");
        atletaCol.setMinWidth(100);        
        atletaCol.setCellValueFactory( cellData -> cellData.getValue().atletaProperty() );
        //atletaCol.setCellValueFactory( new PropertyValueFactory<Person, Boolean>("atleta") );
     atletaCol.setCellFactory(CheckBoxTableCell.forTableColumn(atletaCol) );
        
        /*
        table.addEventHandler( MouseEvent.MOUSE_CLICKED, event -> {
            if (event.getClickCount() == 1) {              
                Person person = table.getSelectionModel().getSelectedItem(); 
                System.out.println(person.firstName + " atleta = " +  person.getAtleta() );
            }
        });*/
        
        
        // Exemplo um 
        table.addEventHandler( MouseEvent.MOUSE_CLICKED, event -> {
            
           TablePosition pos = table.getSelectionModel().getSelectedCells().get(0);
           int row = pos.getRow();     
           
           Person person = table.getItems().get(row);

           TableColumn col = pos.getTableColumn();
           if(col != null) {
              if( col.textProperty().get().equals("Atleta") )  {                 
                  System.out.println(col.textProperty().get()  + " column=" +  pos.getColumn() + " e' um Atleta=" + person.getAtleta() );
              }
           }   
        });  
        
        
       
       /* exemplo dois 
        atletaCol.setCellFactory(column -> {
            return new TableCell<Person, Boolean>() {
                
                CheckBox check = new CheckBox("");
                
                { 
                   //check.setDisable(true);
                   
                   this.setOnMouseClicked( (e) -> {
                      Person person = table.getSelectionModel().getSelectedItem(); 
                      System.out.println(person.firstName + " atleta = " +  person.getAtleta() );
                   } );
                        
                } 
                @Override
                protected void updateItem(Boolean item, boolean empty) {
                    super.updateItem(item, empty);
                    if (item == null || empty) {                        
                        setText(null);
                        setGraphic(null);
                        
                    } else {
                        setText("");                        
                        check.setSelected(item);                 
                        setGraphic(check);
                    }
                }
            };
        });
        */
        
        
        table.setEditable(false);
        table.setItems(data);
        table.getColumns().addAll(firstNameCol, lastNameCol, atletaCol);
        
        /*
        table.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> {
            Person person = table.getSelectionModel().getSelectedItem();
            System.out.println(person.firstName + " atleta = " +  person.getAtleta() );
        });   
        */
 
        final Button addButton = new Button("Add");
        addButton.setOnAction((ActionEvent e) -> {
            data.add(new Person("Z","X",true));
         });
 
        hb.getChildren().addAll(addButton);
        hb.setSpacing(3);
 
        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setPadding(new Insets(10, 0, 0, 10));
        vbox.getChildren().addAll(table, hb);
 
        ((Group) scene.getRoot()).getChildren().addAll(vbox);
 
        stage.setScene(scene);
        stage.show();
    }
 
    public static class Person {
 
        private final SimpleStringProperty firstName;
        private final SimpleStringProperty lastName;
        
        private BooleanProperty atleta = new SimpleBooleanProperty(false);
 
        private Person(String fName, String lName, boolean atleta) {
            this.firstName = new SimpleStringProperty(fName);
            this.lastName = new SimpleStringProperty(lName);
            this.atleta  = new SimpleBooleanProperty(atleta);             
        }
 
        public String getFirstName() {
            return firstName.get();
        }
 
        public void setFirstName(String fName) {
            firstName.set(fName);
        }
 
        public String getLastName() {
            return lastName.get();
        }
 
        public void setLastName(String fName) {
            lastName.set(fName);
        }
        
        public BooleanProperty atletaProperty() {
            return atleta;
        }
                
        public void setAtleta(boolean atleta) {
            this.atleta.set(atleta);
        }
        
        public boolean getAtleta() {
            return atleta.get();
        }
    }
}

Mas lembre-se, para que alguem possa lhe ajudar em sua duvida é preciso explicar certinho o tipo de problema que deseja resolver, e caso esteja dentro do meu conhecimento e eu tenha disponibilidade será um prazer lhe auxiliar, caso contrario tem outros colegas aqui de bom coração.

Bons Codigos

Obrigado pelas respostas. Sempre grato pela ajuda e dispassa palavras sobre sua presteza e boa vontade. Realmente eu não soube explicar meu problema. Apenas quero verificar se o checkbox da tableview está selecionado ou não e retornar true ou false, mas até agora, não consegui encontrar um evento na tableview que me retorne se a checkbox está selecionada ou não.

Veja com calma o exemplo ultimo que te passei, poe ele pra rodar e veja se faz o que deseja.

Outra coisa, é possivel que a TableView não funciona da forma que você possa estar imaginando.

Primeiro em implementação de alta performance não faz sentido ter um quadro que cabem digamos 50 linhas com 10 colunas para uma tabela digamos de 1 milhao de linhas ter que
gerar 10.000.000 de Nodes entre CheckBox e Label entre outros que levaria a memoria a exaustão facilmente. Ao invés disso mantem-se o necessário de Nodes para a area visivel e os dados vão passando por essa área.

Alias dentro do TableView o desenvolvedor deu uma escorregada nessa questão.

Você acha que a checkbox dentro da tableview não tem o evento isSelect? Se não tiver tenho que partir pra outra.

Tem sim, mas antes me responda voce rodou o exemplo que te passei e entendeu o que Eu escrevi?

Sim. Rodei ele retorna true ou false mas não altera o status da checkbox. as que add true retorna true a que esta false retorna false. Preciso que ao selecionar retorna true ao clicar novamente desmarca e retorna false. Obrigado

Então, te perguntei anteriormente se você queria editar o conteudo da TableView e voce disse não.

Então Entendi que editar seria os dados do banco e não da tableview. Peço desculpa.

Tudo depende, se quer usar pra modificar o banco dá tambem, já se quer apenas alterar o conteudo da celula sem mexer na banco dá tambem.

Tudo vai do que voce quer fazer

@FXML private TableView tabelaPessoa;
@FXML private TableColumn<Dados, Long> tbcolId;
@FXML private TableColumn<Dados, String> tbcolNome;
@FXML private TableColumn<Dados, Boolean> tbcolPresenca;

//metodo carrega banco na tabela
public void carregaTabela() {
tbcolId.setCellValueFactory(new PropertyValueFactory(“id”));
tbcolNome.setCellValueFactory(new PropertyValueFactory(“nome”));
tbcolPresenca.setCellFactory(CheckBoxTableCell.forTableColumn(tbcolPresenca));
tabelaPessoa.setItems(atualiza());
}

//metodo carrega banco na tabela
public ObservableList atualiza() {
Mysql msql = new Mysql();
return FXCollections.observableArrayList(msql.getList());
}
Esta tudo pronto so falta acessar a celula da tableview e editar a checkbox.
Vou usar esse evento dentro do metodo initialize

Você é novo em JavaFX ou novo em programação Java?, ou os dois?

Os dois. Novo em java e javafx