Transportar dados para tela de edição

Boa dia. Devido a um tópico anterior eu consegui pegar os dados do usuário. Criei um botão de edição que, ao selecionar os dados no TableView, os dados são mostrados.
Porém, estou com dificuldades de transportar os dados para o formulário de atualização, em que os dados serão mostrados para o usuário e posteriormente atualizados.

Este é o métodos, (está com o nome de teste porque eu não achei o nome adequado), é o que retorna os dados clicados e abre a tela com o formulário para a edição

public void teset() throws Exception { 
        // Retorna os dados do usuário selecionado
        UsuarioProperty usuarioProperty = tbUsuario.getSelectionModel().getSelectedItem();
        String nome = usuarioProperty.getNome();
        
        // abre uma nova instancia para a ediçào dos dados
        new ManterUsuario().start(new Stage());
        this.executarAcaoFechar();
        
    }

E este é o meu controler para manter o usuário.

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

import br.com.luizpicolo.application.ManterUsuario;
import br.com.luizpicolo.application.DialogoErro;
import br.com.luizpicolo.application.DialogoInformacao;
import br.com.luizpicolo.application.DialogoSucesso;
import br.com.luizpicolo.application.PesquisaUsuario;
import br.com.luizpicolo.dao.UsuarioDAO;
import br.com.luizpicolo.model.Usuario;
import br.com.luizpicolo.util.Utils;
import java.net.URL;
import java.security.NoSuchAlgorithmException;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TextField;
import javafx.stage.Stage;

/**
 *
 * @author w3case
 */
public class ManterUsuarioController implements Initializable {

    @FXML
    private TextField tfCodigo;
    @FXML
    private TextField tfNome;
    @FXML
    private TextField tfLogin;
    @FXML
    private TextField tfSenha;
    @FXML
    private TextField tfSenha2;
    @FXML
    private CheckBox cbComanda;
    @FXML
    private CheckBox cbAdministrador;
    
    private Usuario usuario;

    @FXML
    // Método para cadastrar o usuario
    public void cadastrarUsuario() throws Exception {

        // Validar os campos para cadastro do novos usuários
        if ("".equals(tfNome.getText())) {
            new DialogoInformacao("Campo nome é necessário").start(new Stage());
        }

        try {
            // Cria-se o objeto usuario e atribui ao mesmo um estado
            Usuario usuario = new Usuario();
            usuario.setNome(tfNome.getText());
            usuario.setLogin(Utils.criptografar(tfLogin.getText()));
            usuario.setSenha(Utils.criptografar(tfSenha.getText()));

            // Verifica-se os valores. Caso os valores sejam falsos, mantem o valor padrão do
            // objeto
            if (cbComanda.isSelected()) {
                usuario.setUtilizadorComanda(1);
            }

            if (cbAdministrador.isSelected()) {
                usuario.setTipo(1);
            }

            // Cria-se o objeto DAO
            UsuarioDAO dao = new UsuarioDAO();
            dao.adicionarUsuario(usuario);

            // Mensagem de sucesso
            new DialogoSucesso("Üsuário Gravado com Sucesso").start(new Stage());

            // Limpar Formulário
            tfCodigo.clear();
            tfNome.clear();
            tfLogin.clear();
            tfSenha.clear();
            tfSenha2.clear();
            cbComanda.setSelected(false);
            cbAdministrador.setSelected(false);

        } catch (NoSuchAlgorithmException ex) {
            new DialogoErro("Erro ao gravar usuário.").start(new Stage());
        }

    } 

    // Abrir sena de pesquisa
    @FXML
    public void abrirTelaPesquisaUsuario() {
        try {
            new PesquisaUsuario().start(new Stage());
            this.executarAcaoFechar();
        } catch (Exception e) {
            System.out.println(e);
        }
    }

    @FXML
    public void executarAcaoFechar() {
        ManterUsuario.getStage().close();
    }

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

A dúvida é como eu transporte estes dados de um controller para o outro. Ou seja, eu criaria um novo objeto usuário, mas como eu mandaria está mensagem para o outro controller?

Olá novamente Luiz!

Acho que o jeito mais viável e simples é trabalhar com “variáveis estáticas” e “getters e setters”.
Ou seja, no controller que irá receber os dados, crie variáveis estáticas e seus devidos getters e setters. Exemplo:

[code]public class ManterUsuarioController implements Initializable {

private static String nome;

public static String getNome() {
return nome;
}

public static void setNome(String nome) {
ManterUsuarioController.nome = nome;
}

// Demais códigos…

}[/code]

Então, quando for abrir esta tela, basta utilizar este setter para receber o dado.

ManterUsuarioController.setNome(usuarioProperty.getNome()); new ManterUsuario().start(new Stage());

Testa aí! :smiley:

Poxa meu amigo, quebrei a cabeça ontem e fiz com metodo estatico mesmo. Só agora vi que vocë havia respondido.
Mas valeu ai, na verdade sua dica vai deixar mais elegante minha aplicação.

Uma coisa. Eu tenho um table view com 3 itens, porém o usuário tem cerca de 7 atributos que são retornados dos banco. Pensei carregar todos na tableview, porém, deixar visivel apenas os necessários e, ao carregar os dados para ediçào, ao invez de fazer uma consulta no banco para retornar os dados, carregar o da tableview.
Esse seria o melhor caminho?

Olha, na minha humilde opinião, sim.
Não é necessário mostrar ao usuário todos os dados, mostre apenas os que são fundamentais. Os outros serão encapsulados em seus Models.

É sempre uma boa saída! :smiley: