JavaFx TableView com Imageview não funcionando

Olá amigos, alguém poderia me dar uma luz para resolver a questão abaixo?

Tenho uma TableView que esta sendo corretamente populada e dentro dela tenho um campo

TableCollumn<Empresas, ImageView> col_img;

Essa coluna deveria inserir uma imagem de acordo com uma condição de outra célula, estou fazendo essa forma:

Image aprovado = new Image(this.getClass().getResource("/xx/imagens/green.png").toString());
Image reprovado = new Image(this.getClass().getResource("/xx/imagens/red.png").toString());
ImageView imgAprov = new ImageView(aprovado);
ImageView imgReprov = new ImageView(reprovado);

col_img.setCellValueFactory(param -> {
	BooleanBinding liberado = new SimpleBooleanProperty(param.getValue().getLiberado()).not();
	
	return Bindings.when(liberado)
		.then(imgAprov)
		.otherwise(imgReprov);
});

A condição está funcionando, mas se as células seguintes retornarem o mesmo valor, só é colocada imagem na ultima linha.

anexei a imagem para verificação.!

Sem%20t%C3%ADtulo|690x387

nesse caso, as duas linhas deveriam retornar o icone verde, já que o parametro de verificação delas as duas são true.

Bom, melhorei o código para este:

    Image aprovado = new Image(this.getClass().getResource("/castclient_jfx/imagens/green.png").toString());
                                            Image reprovado = new Image(this.getClass().getResource("/castclient_jfx/imagens/red.png").toString());
ImageView imgAprov = new ImageView(aprovado);
ImageView imgReprov = new ImageView(reprovado);

 col_img.setCellValueFactory((param) -> param.getValue().getLiberado() ? new SimpleObjectProperty<>(imgAprov) : new SimpleObjectProperty<>(imgReprov));

O resultado continua o mesmo, o que andei estudando e uma possível resposta é que seria necessário setar um id para a coluna ou para a linha…

mas no meu caso não ainda não encontrei um meio para isso…

import javafx.application.Application;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;
import javafx.util.Callback;

public class TableViewEmpresa extends Application {

    private final TableView<Empresa> table = new TableView<>();
    private final ObservableList<Empresa> observableList = FXCollections.observableArrayList();

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

    @Override
    public void start(Stage stage) {

        
        stage.setTitle("Tableview com Icones");
        stage.setWidth(600);
        stage.setHeight(600);

        setTableappearance();

        
        observableList.addAll(  new Empresa("Modelo S/A", new Boolean(false)),
                                new Empresa("Usina Java", new Boolean(true)), 
                                new Empresa("Firma A", new Boolean(false)),
                                new Empresa("Fazenda Plural Ltda", new Boolean(true)) );
        
        table.setItems(observableList);

        TableColumn<Empresa,String> colNome = new TableColumn<>("Empresa");
        colNome.setCellValueFactory(new PropertyValueFactory<>("nome"));

        TableColumn<Empresa, Boolean> colStatus = new TableColumn<>("Status");
        colStatus.setCellValueFactory(new PropertyValueFactory<>("status"));
        
        colStatus.setCellFactory(  new Callback<TableColumn<Empresa, Boolean>, TableCell<Empresa, Boolean>>() { 
            
            
            @Override
            public TableCell<Empresa, Boolean> call(TableColumn<Empresa, Boolean> param) {
                
               return
               new TableCell<Empresa, Boolean>() {

                    Image imgok     = new Image("file:///home/jorge/NetBeansProjects/FX-Tests/src/com/menezes/Cancel_40972.png");
                    Image imgcancel = new Image("file:///home/jorge/NetBeansProjects/FX-Tests/src/com/menezes/ok_accept_15562.png");
                    
                    ImageView imv = new ImageView();                     
                    {
                       imv.setFitWidth(32);
                       imv.setFitHeight(32);                       
                    }

                    @Override
                    public void updateItem(Boolean item, boolean empty) {
                        super.updateItem(item, empty);
                        if( empty ) {
                            setGraphic(null);
                        } else {
                            Empresa empresa = getTableView().getItems().get(getIndex());                            
                            if(item.booleanValue() == true ) {
                                
                                imv.setImage(imgok);
                                setGraphic(imv);
                                
                            }else {
                                imv.setImage(imgcancel);
                                setGraphic(imv); 
                            }
                        }
                    } 
            };
        
          }
        });
            
        table.getColumns().addAll(colNome, colStatus);

        Scene scene = new Scene(new Group(table));

        stage.setScene(scene);
        stage.show();
    }

    private void setTableappearance() {
        table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
        table.setPrefWidth(600);
        table.setPrefHeight(600);
    }



    public class Empresa {

        private SimpleStringProperty nome = new SimpleStringProperty();
        private SimpleBooleanProperty status = new SimpleBooleanProperty();

        private Empresa(String nome, Boolean status) {
            this.nome.setValue(nome); 
            this.status.setValue(status); 
        }

        
        public void setNome(String nome) {
            this.nome.setValue(nome);
        }
        
        public String getNome() {
            return nome.getValue();
        }

        
        public void setStatus(Boolean status) {
            this.status.setValue(status);
        }
        
        public Boolean getStatus() {
            return status.getValue();
        }
        

    }
}

Bons Codigos

Opa, tudo bem, amigo?

primeiramente obrigado pela responsta…eu apliquei o código que você passou…
Estou intrigado por que o resultado está sendo o mesmo, veja a imagem que anexei…todos estão como true e todos deveriam retornar o icone verde, mas só mostra na ultima linha.

Opa, achei o problema, eu estava criando o Imageview fora do setCellFactory.
coloquei dentro e tudo funcionou perfeitamente…
obrigado.

1 curtida