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.