Imagens na TableView

Olá pessoal como eu consigo carregar uma imagem na TableView com JavaFX, já rodei mais não consegui !

Veja se esse exemplo lança uma luz na sua questão.

import javafx.scene.image.ImageView;

public class CustomImage {

    private ImageView image;

    CustomImage(ImageView img) {
        this.image = img;
    }

    public void setImage(ImageView value) {
        image = value;
    }

    public ImageView getImage() {
        return image;
    }
}

–>

    import javafx.application.Application;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    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.scene.layout.BorderPane;
    import javafx.stage.Stage;

    public class ImageViewInTableView extends Application {

        public Parent createContent() {

            /* layout */
            BorderPane layout = new BorderPane();

            /* layout -> center */
            TableView<CustomImage> tableview = new TableView<CustomImage>();

            /* layout -> center -> tableview */

            /* initialize two CustomImage objects and add them to the observable list */
            ObservableList<CustomImage> imgList = FXCollections.observableArrayList();
            CustomImage item_1 = new CustomImage(new ImageView(new Image("Icon_AddNewPatient.png")));
            CustomImage item_2 = new CustomImage(new ImageView(new Image("Icon_EditPatient.png")));
            imgList.addAll(item_1, item_2);

            /* initialize and specify table column */
            TableColumn<CustomImage, ImageView> firstColumn = new TableColumn<CustomImage, ImageView>("Images");
            firstColumn.setCellValueFactory(new PropertyValueFactory<CustomImage, ImageView>("image"));
            firstColumn.setPrefWidth(60);

            /* add column to the tableview and set its items */
            tableview.getColumns().add(firstColumn);
            tableview.setItems(imgList);

            /* add TableView to the layout */
            layout.setCenter(tableview);
            return layout;
        }

        @Override
        public void start(Stage stage) throws Exception {
            stage.setScene(new Scene(createContent()));
            stage.setWidth(200);
            stage.setHeight(200);
            stage.show();
        }

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

O detalhe é o seguinte eu quero salvar no banco de dados e depois listar ela no TableView , já tinha visto mais ou menos seu exemplo mas não consegui resolver!

Basta pegar a imagem e colocar na TableView, porem, não é uma boa pratica colocar imagens na TableView, principalmente se a Tabela for grande, imagens consomem muita memoria e pode deixar o processamento extremamente lento. O ideal é trazer a imagem conforme a necessidade e se insistir em trazer imagens dentro da TableView e’ aconselhavel pensar em traze-las em background de tal forma que não prenda o processamento.

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.*;

import javafx.application.Application;
 
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;

public class LeImageBanco extends Application
{
    PreparedStatement ps;
    Connection conn;
    ResultSet rs;
     
    public static void main(String[]args)
    {
        Application.launch(args);
    }
    @Override
    public void start(Stage primaryStage)
    {
        BorderPane bp = new BorderPane();
        Scene scene = new Scene(bp,800,600);
        
        ImageView imgView = new ImageView(); 
        imgView.setFitWidth(200);
        imgView.setFitHeight(200);
        
 
        Button loadB = new Button("load");
        
        bp.setBottom(loadB);//placing our load button on the button of our borderpane
        bp.setCenter(imgView);//placing our imageview at the center of the borderpane
        
        loadB.setOnAction((ActionEvent t) -> {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                conn = DriverManager.getConnection("jdbc:mysql://localhost/bancoTeste","root","minhasenha");
                
                ps = conn.prepareStatement("SELECT * FROM pessoas where codigo=1");
                rs = ps.executeQuery();
                rs.next(); // pega apenas a primeira para demonstracao
                    
                InputStream fis = rs.getBinaryStream("foto"); 
                Image imagex = new Image(fis);
                     
               imgView.setImage(imagex);
               
              conn.close();
                
            } catch (ClassNotFoundException ex) {
               ex.printStackTrace();
            } catch (SQLException ex) {
               ex.printStackTrace();            
            }
        });
        primaryStage.setTitle("Imagem do Banco");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

}

entendi, pra você só ter uma ideia isso é uma opção pra o sistema de delivery mas eu tbm posso fazer melhor, por exemplo, eu queria coloca uma pequena imagem, que seria 3 quadrados 1 amarelho, 1 verde e 1 vermelho, para indicar a seguinte situação, vermelho quando o pedido esta em produção, amarelo quando o pedido saiu para entregar e verde quando já foi entregue, mas também eu poderia coloca a linha ou a cor da fonte de outra cor no tableview se for mais tranquilo de ser feito ! nesse caso ficaria assim:

quando o pedido estiver em produção a linhas aparecem em vermelho, quanto estiverem em entrega ficaria amarelo e quando fosse entregue ficaria verde, isso seria para facilitar mais a minha questão de visualização !

sera que eu consigo fazer assim ?

FIZ ESSE CODIGO:

tColumnStatus.setCellFactory(column -> {
return new TableCell<ModelVenda, String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);

            setText(empty ? "" : getItem().toString());
            setGraphic(null);

            TableRow<ModelVenda> currentRow = getTableRow();
            
            if (!isEmpty()) {

                if(item.equals("PRODUÇÃO")) 
                
                            currentRow.setStyle("-fx-background-color: #E9967A");
                           // setTextFill(Color.RED);
               
                else if(item.equals("ENTREGA SAIU")) 
                    currentRow.setStyle("-fx-background-color: #F0E68C");
                  
                else
                
                  currentRow.setStyle("-fx-background-color: #90EE90");
            }
        }
    };
});

TE AI TA FUNCIONANDO O QUE ESTA ESTRANHO É PORQUE QUANDO EU COLOCO, currentRow.setStyle("-fx-font-color: #90EE90"); OU currentRow.setStyle("-fx-text-fill: #90EE90"); ELE NÃO FUNCIONA QUANDO EU USO setTextFill(Color.RED); FUNCIONA MAS SÓ PINTA AQUELA DETERMINADA COLOCA JÁ QUANDO EU COLOCO currentRow.setStyle("-fx-background-color: #F0E68C"); ELA PINTA TODA A LINHA MAS NÃO MUDA A COR DA FONTE

ALGUEM PODERIA ME AJUDAR NESSE CASO ? POIS EU SÓ GOSTARIA DE PINTAR A FONTE

Parece que serão poucas imagens, então não vejo problema. Se resolver pintar somente as linhas tambem dá certo.