Como criar um metodo que chame uma outra janela e preencha o objeto desejado para atualizar

Olá gente!

Preciso de um metodo que escolha salvar ou atualizar:

Na minha aplicação desktop eu faço o seguinte no botao salvar da janela que tem o formulario:

try { cadastrarLivro(new Livro()); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Erro ao cadastrar! Causa: " + e); }

E eu preciso modificar esse código.

Sendo que quando for atualizar os dados o botão atualizar da janela 1 precisará chamar a janela de formulario com os campos preenchidos.
Como faço isso?

A sua janela de edição deve conter dois construtores. Um vazio e outro que recebe um objeto.

[code]
public class FormularioEdicao extends JDialog {

Entidade entidade;
boolean edicao;
public FormularioEdicao() {  
    edicao = false;
}

public FormularioEdicao(Entidade entidade) {
    edicao = true;
    this.entidade = entidade;
    preencherFormulario(entidade);
}

private void preencherFormulario(Entidade entidade) {
    // Preenche o formulário...
}

}[/code]
Chama o formulário com construtor vazio quando quiser criar, e com o construtor que recebe a entidade quando for atualizar.
Fique com Deus! :smiley:

Olá!

Para eu entender melhor,

vou mostrar as minhas telas de cadastro e pesquisa com comentários. (Anexo)

Este construtor vazio e outro cheio eu coloco em qual das duas? Na de cadastro/Atualização (É assim que chamo meu formulário)?

A propósito, é nesse botão salvar que tenho:

try { cadastrarLivro(new Livro()); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Erro ao cadastrar! Causa: " + e); }

Preciso modificá-lo para que ele diferencie se estou fazendo um save ou um update. Tem como? :slight_smile:

Acha que isso é viável? Existe uma maneira mais fácil de se fazer isso?

Obrigada desde já! :thumbup:


Ola,

Voce pode ver se o objeto que lhe foi passado tem o ID vazio ou nao.

Se o id for vazio, quer dizer que é um novo objeto e deve ser salvo, se o ID já existir, que dizer entao que é uma atualizacao.

Abaixo tem um exemplo que utilizei isso e funcionou perfeitamente:


// Save, insert or update
	public long save(Type type) {
		long id = type.getId();

		if (id != 0) {
			update(type);
		} else {
			// Insert a new one
			id = insert(type);
		}

		return id;
	}

	// Insert
	public long insert(Type type) {
		ContentValues values = new ContentValues();
		values.put(Types.NAME, type.getName());

		long id = insert(values);
		return id;
	}

	// Insert
	public long insert(ContentValues values) {
		long id = db.insert(TABLE_NAME, "", values);
		return id;
	}

	// Update with the _id
	public int update(Type type) {
		ContentValues values = new ContentValues();
		values.put(Types.NAME, type.getName());

		String _id = String.valueOf(type.getId());

		String where = Types._ID + "=?";
		String[] whereArgs = new String[] { _id };

		int count = update(values, where, whereArgs);

		return count;
	}

	// Update with the values
	// The "where" is for identify the _id
	public int update(ContentValues values, String where, String[] whereArgs) {
		int count = db.update(TABLE_NAME, values, where, whereArgs);
		Log.i(CATEGORY, "Update [" + count + "] registers.");
		return count;
	}

[quote=Jackye]
Este construtor vazio e outro cheio eu coloco em qual das duas? Na de cadastro/Atualização (É assim que chamo meu formulário)?[/quote]
Exato. Na “cadastro/atualização”, ou seja lá como você vai chamar essa classe.

[quote=Jackye]A propósito, é nesse botão salvar que tenho:

try { cadastrarLivro(new Livro()); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Erro ao cadastrar! Causa: " + e); }Preciso modificá-lo para que ele diferencie se estou fazendo um save ou um update. Tem como?

Acha que isso é viável? Existe uma maneira mais fácil de se fazer isso?[/quote]
Bom, se eu não me engano, você está usando o Hibernate, né?
Se estiver, você pode fazer a chamada do método saveOrUpdate se sua Session. Assim, ele salva ou atualiza o seu objeto, não sendo necessário criar dois métodos diferentes para cada operação.

[code]public class ServicosLivros {

public salvarLivro(Livro livro) throws HibernateException {

    Session session = HibernateUtil.getSession();
    session.saveOrUpdate(livro);
    session.close();
}

}

//Ao salvar…
try {
ServicosLivros servicosLivros = new ServicosLivros();
servicosLivros.salvarLivro(livro);
}
catch (HibernateException hibernateException) {
hibernateException.printStackTrace();
}
catch (Exception generalException) {
generalException.printStackTrace();
}
[/code]
Caso não esteja, siga a ideia do nosso amigo Bertan: verifique se o objeto passado contém o ID preenchido. Se sim, você atualiza. Caso contrário, você insere.

[code]public class ServicosLivros {

public salvarLivro(Livro livro) throws SQLException {

    if (livro.getID() != 0)
        atualizarLivro(livro);
    else
        inserirLivro(livro);
}

private void atualizarLivro(Livro livro) throws SQLException {
    // Código para UPDATE...
}
private void inserirLivro(Livro livro) throws SQLException {
    // Código para INSERT...
}

}

//No botão, segue o mesmo princípio acima.[/code]

Espero ter ajudado,
fique com Deus! :smiley:

Olá.
Agora mudei novamente de estratégia.
Achei mais fácil: criar outra janela com todos os campos do objeto e com funções de apenas atualizar.

A dúvida que ainda persiste é:
Como fazer de um Frame 1 que lista todos os objeto, quando um objeto for selecionado e o usuário quiser atualizar
chamar o Frame 2 com todos os campos preenchidos do objeto escolhido?

Desde já agradeço a atenção.
:thumbup: