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
j-menezes:
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); } } } }; } });
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