Verificar seleção de CheckBox dentro de uma tableview

 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

Os dois. Java e javafx sou novo. Estou tentando fazer uma aplicação para o trabalho da faculdade.

Olha!!, vou traçar um caminho e se desejar poderá segui-lo.
Em resumo é assim.

1.Pode pegar qualquer informação de uma TableView acessando os dados que foram enviados pra ela.

2.Dentro da TableView pode alterar o conteudo de determinada Celula pra exibir qualquer coisa visivel, mesmo que não tenha nada a ver com o que foi enviado, para isso JavaFX tem um recurso bastante interessante, o método setGraphic dentro dos Nodes.

3.Evite copiar e colar pura e simplesmente codigos de terceiros e se fazer, tenta entender o que cada coisa faz, nem precisa ir a fundo, entendendo já basta.

4.Quando clica na celula da TableView, tem o dado daquela celula, mas voce pode pegar o dado da linha toda, no exemplo acima faz isso

5.Posta qualquer duvida que desejar, mas de preferencia algo que dê pra ser reproduzido, assim fica mais facil entender o problema e se possível apontar uma solução.

Veja esse exemplo modificando a celula, é bem simples e poderoso, veja que mandei pintar um CheckBox, mas poderia colocar qualquer coisa.

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("First Name");
        firstNameCol.setMinWidth(100);
        firstNameCol.setCellValueFactory(
                new PropertyValueFactory<>("firstName"));
 
        TableColumn lastNameCol = new TableColumn("Last Name");
        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) );
         
        
        atletaCol.setCellFactory(column -> {
            return new TableCell<Person, Boolean>() {
                
                CheckBox check = new CheckBox("");
                
                { 
                   
                   check.selectedProperty().addListener( (obj,old,n) -> {
                        System.out.println("Troquei Check " + n );                      
                   });
                   
                   /*
                   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();
        }
    }
}

Obrigado j-menezes pela Ajuda. Não só pelos códigos mas também pelas dicas de estudos. Pessoas assim nos motiva a continuar. Gratidão!!

1 curtida