Boa tarde, estou tentando fazer o conteúdo da tabela do banco de dados aparecer na minha TableView., mas o conteúdo da última linha da ObservableList se repete e somente ele aparece, várias vezes(a quantidade de itens que o método retorna é a quantidade de vezes que ele aparece). Já vi em outros fórums falando pra criar uma UserMaster, mas não achei como importar essa classe.
Mesmo sem usar o Banco o último item é repetido e só ele aparece.
O método é esse:
public static void consultarDados() {
ObservableList<Produto> obsProduto = FXCollections.observableArrayList();
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conexao = DriverManager.getConnection("jdbc:mysql://localhost:3306/marquinhos", "root", "9GSFna)<161LYgt");
String query = "SELECT * FROM produto WHERE nome LIKE ?";
PreparedStatement stmt = conexao.prepareStatement(query);
stmt.setString(1, "%" + Consulta.txtBuscar.getText() + "%");
//
ResultSet rs = stmt.executeQuery();
//Popular Tabela
while(rs.next()) {
// System.out.println("Nome -> " + rs.getString("nome")); //rs.getString("nomeDaColunaNoBancoDeDados")
Consulta.lblProduto.setText(Consulta.lblProduto.getText() + rs.getString("nome") + " \n");//
Consulta.lblDescricao.setText(Consulta.lblDescricao.getText() + rs.getString("descricao") + " \n");//
Consulta.lblPreco.setText(Consulta.lblPreco.getText() + rs.getString("preco") + " \n");//
Consulta.lblQuantidade.setText(Consulta.lblQuantidade.getText() + rs.getString("quantidade") + " \n");//
/************/
// UserMaster cm = new UserMaster();
obsProduto.add(new Produto(rs.getString("nome"), rs.getString("descricao"), rs.getString("preco"), rs.getInt("quantidade")));
// row.add(obsProduto);
// obsProduto.add();
}
Consulta.table.setItems(obsProduto);
System.out.println("Concluído");
/**************/
// Consulta.setTableItems("Consulta.table", rs.getString("nome"), rs.getString("descricao"), rs.getString("preco"), rs.getInt("quantidade"));
stmt.close();
conexao.close();
} catch (ClassNotFoundException e) {
System.out.println("Classe não Encontrada");
} catch (SQLException e) {
System.out.println("Erro de SQLException -> " + e.getMessage());
}
// return obsProduto;
}
A classe Consulta:
import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.control.cell.*;
import javafx.scene.layout.*;
import javafx.scene.image.*;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.event.*;
import javafx.collections.*;
import java.util.*;
public class Consulta extends Application {
static Stage stg = new Stage();
static TextField txtBuscar = new TextField();
static Label lblProduto = new Label("PRODUTO \n\n");
static Label lblDescricao = new Label("DESCRIÇÃO \n\n");
static Label lblPreco = new Label("PREÇO \n\n");
static Label lblQuantidade = new Label("QTDE \n\n");
private Button btnBuscar = new Button("Buscar");
private Button btnCadastrar = new Button("Novo Produto");
static TableView<Produto> table = new TableView<>();
private VBox layout = new VBox();
private HBox hb1 = new HBox();
private HBox hb2 = new HBox();
public void start(Stage stage) {
TableColumn<Produto, String> colProduto = new TableColumn<>("Produto");
colProduto.setPrefWidth(200);
colProduto.setCellValueFactory(new PropertyValueFactory<>("nome"));
TableColumn<Produto, String> colPreco = new TableColumn<>("Preço");
colPreco.setPrefWidth(100);
colPreco.setCellValueFactory(new PropertyValueFactory<>("preco"));
TableColumn<Produto, String> colDescricao = new TableColumn<>("Descrição");
colDescricao.setPrefWidth(500);
colDescricao.setCellValueFactory(new PropertyValueFactory<>("descricao"));
TableColumn<Produto, Integer> colQuantidade = new TableColumn<>("Quantidade");
colQuantidade.setPrefWidth(100);
colQuantidade.setCellValueFactory(new PropertyValueFactory<>("quantidade"));
table.getColumns().addAll(colProduto, colDescricao, colPreco, colQuantidade);
// table.setItems(this.obterProduto());
// table.setItems(DataBase.consultarDados());
table.setEditable(true);
Scene scn = new Scene(layout, 900, 800);
stg = stage;
stg.setScene(scn);
stg.show();
layout.getChildren().addAll(table, hb1, hb2);
hb1.getChildren().addAll(txtBuscar, btnBuscar, btnCadastrar);
hb2.getChildren().addAll(lblProduto, lblDescricao, lblPreco, lblQuantidade);
txtBuscar.setPromptText("Nome do Produto");
btnBuscar.setOnAction(e -> {
lblProduto.setText("PRODUTO\n\n");
lblDescricao.setText("DESCRIÇÃO\n\n");
lblPreco.setText("PRECO\n\n");
lblQuantidade.setText("QUANTIDADE\n\n");
DataBase.consultarDados();
});
btnCadastrar.setOnAction(e -> new Cadastro().start(Cadastro.stg));
DataBase.consultarDados();
}
//Usando esse acontece o mesmo erro
public static ObservableList<Produto> obterProduto() {
ObservableList<Produto> obsProduto = FXCollections.observableArrayList();
obsProduto.add(new Produto("pa", "da", "RSx", 2));
obsProduto.add(new Produto("pb", "db", "RSy", 5));
return obsProduto;
}
// public static void setTableItems(String dbNome, String dbDescricao, String dbPreco, int dbQuantidade) {
// table.setItems(dbNome, dbDescricao, dbPreco, dbQuantidade);
// }
}
E a clsse Produto:
public class Produto {
static String nome;
static String preco;
static String descricao;
static int quantidade;
public Produto(String nome, String descricao, String preco, int quantidade) {
this.nome = nome;
this.descricao = descricao;
this.preco = preco;
this.quantidade = quantidade;
}
public static String getNome() {
return nome;
}
public static String getPreco() {
return preco;
}
public static String getDescricao() {
return descricao;
}
public static int getQuantidade() {
return quantidade;
}
// public static void preencherTabela(Connection conexao, ObservableList<Produto> lista) {
// //
// }
}
Se eu tenho por exemplo:
osbList.add(new Produto( "hd exerno", descricao, preco, quantidade));
osbList.add(new Produto( "Carregador Portátil", descricao, preco, quantidade));
osbList.add(new Produto( "Cartao de memoria", descricao, preco, quantidade));
vai aparecer 3 vezes o cartao de memoria