1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

TableView JavaFX como preencher

Bom dia a todos, Estou iniciando no "complicadinho" JavaFX em uma aplicação desktop, criei uma tableView e quero preencher esse componente com dados do banco.

Uso o Netbeans e ao criar um arquivo "Classe de entidade do banco de dados" ele já me gerou um erro grotesco que resolvi clicando com o botão direto do mouse no projeto e depois indo em Propriedades > Bibliotecas > Processador e exclui alguma coisa do EclipseLink.

Agora eu consigo pegar uma List do banco.

E agora? como eu coloco ela no tableView? eu não acho quase nada sobre tableView na net e o que tem é muito difícil de entender. No Swing Jtable é só criar um tableModel e controlar a List passada pra ela... e no JavaFX tableView?

Main.java

public class Main extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("View.fxml"));

        Scene scene = new Scene(root);

        stage.setScene(scene);
        stage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

View.FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.image.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="br.com.progro.main.Controller">
   <children>
      <MenuBar layoutX="27.0" layoutY="14.0" prefHeight="25.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
        <menus>
          <Menu mnemonicParsing="false" text="File">
            <items>
              <MenuItem mnemonicParsing="false" text="Close" />
            </items>
          </Menu>
          <Menu mnemonicParsing="false" text="Edit">
            <items>
              <MenuItem mnemonicParsing="false" text="Delete" />
            </items>
          </Menu>
          <Menu mnemonicParsing="false" text="Help">
            <items>
              <MenuItem mnemonicParsing="false" text="About" />
            </items>
          </Menu>
        </menus>
      </MenuBar>
      <Button layoutX="64.0" layoutY="54.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="150.0" text="Inserir" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="39.0" />
      <Button layoutX="235.0" layoutY="39.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="150.0" text="Excluir" AnchorPane.leftAnchor="178.0" AnchorPane.topAnchor="39.0" />
      <Label layoutX="372.0" layoutY="43.0" prefHeight="25.0" prefWidth="50.0" text="Buscar:" AnchorPane.leftAnchor="342.0" AnchorPane.topAnchor="39.0" />
      <TextField layoutX="415.0" layoutY="39.0" prefHeight="25.0" prefWidth="300.0" AnchorPane.leftAnchor="406.0" AnchorPane.topAnchor="39.0" />
      <TableView fx:id="tabelaEmpresa" layoutX="167.0" layoutY="191.0" prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="78.0">
        <columns>
          <TableColumn fx:id="colunaEmpresaId" prefWidth="75.0" text="ID" />
          <TableColumn fx:id="colunaEmpresaNome" prefWidth="400.0" text="Nome" />
            <TableColumn fx:id="colunaEmpresaNumero" prefWidth="75.0" text="Número" />
            <TableColumn fx:id="colunaEmpresaTrava" prefWidth="75.0" text="Trava" />
        </columns>
      </TableView>
   </children>
</AnchorPane>

Controller.java

public class Controller implements Initializable {

    private final List<Empresa> lista = new ArrayList<>();
    @FXML
    private TableView<Empresa> tabelaEmpresa;
    @FXML
    private TableColumn<Empresa, Integer> colunaEmpresaId;
    @FXML
    private TableColumn<Empresa, String> colunaEmpresaNome;
    @FXML
    private TableColumn<Empresa, Integer> colunaEmpresaNumero;
    @FXML
    private TableColumn<Empresa, String> colunaEmpresaTrava;

    public void atualiza(){
        try{
            lista.clear();
            EntityManagerFactory emf = Persistence.createEntityManagerFactory("ProgroPU");
            EntityManager em = emf.createEntityManager();
            Query q = em.createNamedQuery("Empresa.findAll");
            for (Object o: q.getResultList()){
                Empresa e = (Empresa) o;
                lista.add(e);
            }
            //Aqui retorna 2 pois há dois registros
            System.out.println(lista.size());
            //parte que não completa
            ObservableList<Empresa> ole = FXCollections.observableArrayList(lista);
            tabelaEmpresa.setItems(ole);
        }catch(Exception ex){
            System.out.println(ex);
        }
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        this.atualiza();
    }

}

Update* Esse código até parece apresentar duas linhas na tabela só que as colunas estão vazias é como se estivessem invisiveis

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags javafx ou faça a sua própria pergunta.