Popular valores em um textview

Galera, desculpa a “santa ignorância”, mas como eu popularia os dados vindos do banco em um textview?
Procurei na net, mas relamente, a parte do java, digo, DAO, Factory e outras coisas são tranquilas, mas a parte da interface eu estou apanhando ainda.
Se alguém pudesse ajudar.

Outra pegunta. Como eu fecharia a janela atual.
Estava usando o system.exit, mas ele fecha tudo.

Bom dia Luiz,

Então, vai depender de qual framework ou conceito você está utilizando para interpretação do banco de dados por código. Se precisa de uma dica, estude sobre o Hibernate, na minha opinião a melhor framework para este fim, e trabalha muito bem com JavaFX.
Se utilizar o Hibernate, também aconselho a trabalhar com Model (conceito MVC), pois fica mais simples o retorno dos dados e a implementação. Fica algo +/- assim:

[code]Pessoa pessoa = HibernateDAO.find(1); //Método de consulta onde o ID da Pessoa seja igual a 1…

txNome.setText(pessoa.getNome());
txIdade.setText(String.valueOf(pessoa.getIdade()));

[/code]

A classe Pessoa seria seu Model, e a classe HibernateDAO conteria o controller do banco de dados (padrão Hibernate).

Lembrando que isto é um exemplo fictício, fica um pouco difícil de explicar sem uma estrutura inicial.

Agora, sobre fechar uma tela, eu aconselho a utilizar sua própria Stage, na classe Application.
Exemplo:

[code]public class TestApplication extends Application {

private static Stage stage;

public void start(Stage stage) throws Exception {
// Demais códigos…
TestApplication.stage = stage;
}

public static Stage getStage() {
return stage;
}

}[/code]

Então, na sua classe Controller (implements Initializable), você utiliza esta stage estática para encerrar a determinada tela:

Lembrando que este método não fecha a aplicação, mas apenas a tela indicada. Por isso, é aconselhável a utilizar este padrão em todas as telas, para facilitar a comunicação entre telas.

Espero que tenha ajudado! :smiley:

Bom dia e valeu por sua resposta.
Bem, retornar dados do banco, utilizar o hibernate ou um DAO simples não são o problema. Meu único empecilho é como popular os dados no textview, ou seja, como repassar os dados para a parte visual do site.
Trabalho com web tem muito tempo e, para popular dados lá e muito simples independente da linguagem que se usa em BackEnd. Já a parte desktop me prende muito ainda e, por este motivo, que optei em usar o Javafx e o Flex que dão um pouco mais de liberdade. Contudo o Flex eu praticamente abandonei rsss.

Vou tentar o que me passou e deixo a resposta aqui mais tarde.
Grande abraço.

Na verdade eu errei, eu quero popular os valores em um tableview
Segue meu código.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.luizpicolo.controller;

import br.com.luizpicolo.application.AdicionarCompromisso;
import br.com.luizpicolo.dao.CompromissoDAO;
import br.com.luizpicolo.application.Agenda;
import br.com.luizpicolo.model.Compromisso;
import java.net.URL;
import java.sql.SQLException;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.stage.Stage;

/**
 *
 * @author Luiz Picolo
 */
public class AgendaController implements Initializable {

    @FXML
    // Método que instancia uma novo objeto do tipo dialogoAdicionar
    public void executarAcaoAdicionar() {
        try {
            new AdicionarCompromisso().start(new Stage());
        } catch (Exception e) {
            
        }
    }

    @FXML
    // Método para fechar a janela vigente
    public void executarAcaoFechar() {
        Agenda.getStage().close();
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        
        // Lista todos os compromissos
        CompromissoDAO dao = new CompromissoDAO();
        try {
            for (Compromisso compromisso : dao.getCompromissos()) {
                System.out.println(compromisso.getTitulo());
            }
        } catch (SQLException ex) {
            throw new RuntimeException(ex);
        }
    }
}

Buscando bastante no Oráculo achei algo:
http://docs.oracle.com/javafx/2/ui_controls/table-view.htm

Ah agora sim! :smiley:

Bom, o esquema é o seguinte: com a TableView você trabalha com ObservableList’s e conceito Property.
Sua estrutura é mais ou menos o seguinte:

Primeiro, você precisa criar uma class interna que conterá o Model, no formato Property, para popular dados.
Exemplo:

[code]public class AgendaController implements Initializable {

public class CompromissoProperty {

public SimpleStringProperty titulo;

public CompromissoProperty(String titulo) {
  this.titulo = new SimpleStringProperty(titulo);
}

public String getTitulo() {
  return titulo.get();
}

public void setTitulo(String titulo) {
  this.titulo.set(titulo);
}

}

}[/code]

Para identificar que sua TableView receberá estes properties, você precisa de alguns passos:

  1. Parametrizar a TableView. Exemplo: TableView tbCompromisso;

  2. Criar e parametrizar as TableColumn’s. Exemplo: TableColumn<CompromissoProperty, String> tcTitulo;

  3. Identificar qual a property utilizada na TableColumn. Exemplo: tcTitulo.setCellValueFactory(new PropertyValueFactory<CompromissoProperty, String>(“titulo”));
    OBS: Esta String “titulo” é o mesmo nome da SimpleStringProperty da class interna.

  4. Criar uma ObservableList, onde sua função é praticamente idêntica da ArrayList. Exemplo: ObservableList compromissos = FXCollections.observableArrayList(dao.getCompromissos());

  5. Indicar esta ObservableList para a TableView. Exemplo: tbCompromisso.setItems(compromissos);

Acho que é só isso! :smiley:

Além do modelo de um compromisso atual eu preciso ter um só para popular os dados?

Um só Model Property? Sim sim…
O que você precisa ver é quantas colunas terá sua TableView.
E acho bom que isto seja identificado no FXML (Scene Builder).
Então, você pode colocar quantos atributos você quiser no Model Property. Existem outros tipos de dados como SimpleIntegerProperty, SimpleDoubleProperty, SimpleBooleanProperty, etc…

Perfeito meu amigo.
Por enquanto, obrigado pela valiosa ajuda.

Imagina, qualquer dúvida, é só dar um toque!

Uma outra dúvida.
Todos os meus dados da TableView estão no arquivo FXML, ou seja, eu não criei nada manual (Parte visual), utilizei somente o Scene Build.
Essa parametrização pode ser feita pelo Scene Builder? Como seria?

Bom, pelo que vi, você ainda não utilizou nenhum componente que tenha feito em seu arquivo FXML e jogar no código, certo?
Se for isto, você deve fazer o seguinte:

Você deve dar um nome (ID) no Scene Builder para o componente que irá utilizar.

Então, na sua classe Controller você deve instanciar o componente com o MESMO nome (ID) que você colocou no Scene Builder, anotando-o com a Annotation @FXML.
Exemplo:

[code]public class AgendaController implements Initializable {

@FXML
private TableView tbCompromisso;

// Demais códigos…

}[/code]

Esta Annotation irá instanciar implicitamente seu componente na tela, sem precisar de usar “new” e adicioná-lo a um painel principal.

Na questão da parametrização, não se preocupe, ao criar a TableView e as TableColumn’s no Scene Builder, ele irá criar sem parametrização, assim você poderá parametrizar em tempo de execução sem nenhum problema.

Meu amigo, deu um pequeno erro

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.luizpicolo.controller;

import br.com.luizpicolo.application.AdicionarCompromisso;
import br.com.luizpicolo.dao.CompromissoDAO;
import br.com.luizpicolo.application.Agenda;
import br.com.luizpicolo.model.Compromisso;
import br.com.luizpicolo.model.CompromissoProperty;
import java.net.URL;
import java.sql.SQLException;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;

/**
 *
 * @author Luiz Picolo
 */
public class AgendaController implements Initializable {

    @FXML
    private TableView<CompromissoProperty> tbCompromisso;
    @FXML
    private TableColumn<CompromissoProperty, String> tcID;
    @FXML
    private TableColumn<CompromissoProperty, String> tcTitulo;
    @FXML
    private TableColumn<CompromissoProperty, String> tcData;
    @FXML
    private TableColumn<CompromissoProperty, String> tcObservacao;

    @FXML
    // Método que instancia uma novo objeto do tipo dialogoAdicionar
    public void executarAcaoAdicionar() {
        try {
            new AdicionarCompromisso().start(new Stage());
        } catch (Exception e) {
        }
    }

    @FXML
    // Método para fechar a janela vigente
    public void executarAcaoFechar() {
        Agenda.getStage().close();
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {

        // Lista todos os compromissos
        CompromissoDAO dao = new CompromissoDAO();

        try {
            this.tcID.setCellValueFactory(new PropertyValueFactory<CompromissoProperty, String>("id"));
            this.tcTitulo.setCellValueFactory(new PropertyValueFactory<CompromissoProperty, String>("titulo"));
            this.tcData.setCellValueFactory(new PropertyValueFactory<CompromissoProperty, String>("data"));
            this.tcObservacao.setCellValueFactory(new PropertyValueFactory<CompromissoProperty, String>("observacao"));
            ObservableList<Compromisso> compromissos = FXCollections.observableArrayList(dao.getCompromissos());
            tbCompromisso.setItems(compromissos); 
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

Nesta linha

diz que tem que ser do tipo CompromissoProperty, porém, se eu altero o tipo Compromisso para CompromissoProperty da mais erros ainda.
Realmente, essa parte visual é para mim a parte mais complicada.

Ah sim, na verdade é o seguinte:

Lembra que disse que precisa fazer uma ObservableList dos seus dados vindos do DAO? Exemplo: ObservableList compromissos = FXCollections.observableArrayList(dao.getCompromissos());

Aqui você precisa de uma ObservableList. E para tal, você precisa utilizar os dados do compromisso para criar sua CompromissoProperty.
Dessa forma:

ObservableList<CompromissoProperty> compromissos = FXCollections.observableArrayList(); for (Compromisso compromisso : dao.getCompromissos()) { compromissos.add(new CompromissoProperty(compromisso.getID(), compromisso.getTitulo(), compromisso.getData(), compromisso.getObservacao())); }

Aí sim você utiliza o setItems, passando o “compromissos”.

:smiley:

Deixe-em tentar…

Só tenho uma coisa a dizer: PERFEITO.
Criei um construtor no meu CompromissoProperty e deu tudo certo.

Valeu

Opa, que ótimo que deu tudo certo Luiz!

Espero que isto te faça animar a desenvolver com o JavaFX, é uma plataforma espetacular para aplicações Desktop. Para você que programa web, vai sentir o quanto ela consegue se assemelhar a este conceito, se tratando de gráfico.
Aproveite para dar uma olhada no meu artigo de JavaFX para a revista MundoJ. Acho que seria uma boa referência de estudos da plataforma.
Tem o link da revista na minha assinatura, logo abaixo.

Abraços!