Imagens na TableView

6 respostas
Paulosilv_123

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

6 Respostas

j-menezes

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);
        }
    }
Paulosilv_123

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!

j-menezes

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();
    }

}
Paulosilv_123

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 ?

Paulosilv_123

FIZ ESSE CODIGO:

tColumnStatus.setCellFactory(column -> {

return new TableCell<ModelVenda, String>() {

<a class="mention" href="/u/override">@Override</a>

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

j-menezes

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

Criado 16 de julho de 2019
Ultima resposta 17 de jul. de 2019
Respostas 6
Participantes 2