Retornar a um estado anterior

Estou com uma Jtable na qual altero alguns dados e por fim tem um Jbutton para atualizar, só que para atualizar os dados primeiro eu faço uma verificação no meu BD para saber se existe o nome passado na tabela, se sim a atualização continua e vida que segue, porém se não tiver eu preciso que após o usuário clicar em atualizar apareça um JOptionPane dizendo que o nome não existe ou foi digitado incorretamente, logo ele clica em ok e retorna para a tabela sem que seja necessário preencher novamente todos os dados.

É possível? como faço?

segue algumas partes do código:

import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;
import classes.Palet;
import classes_secundárias.Palet_freezer_DB;
import main.Teste_funcs;

public class Estoque_Modification extends JFrame {

/**
 * 
 */
private static final long serialVersionUID = 1L;
protected static List<Palet> palets = new ArrayList<>();

public static void main(String[] args) {

	try {
		for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
			if ("Windows".equals(info.getName())) { // Para mudar o Design da interface
				javax.swing.UIManager.setLookAndFeel(info.getClassName());
				break;
			}
		}
	} catch (ClassNotFoundException | InstantiationException | IllegalAccessException
			| javax.swing.UnsupportedLookAndFeelException ex) {
		System.err.println(ex);
	}

	Estoque_Modification tela = new Estoque_Modification(1);
	
	tela.setLocationRelativeTo(null);
	tela.setDefaultCloseOperation(EXIT_ON_CLOSE);
	tela.setVisible(true);
}

private class PalletCellRenderer implements TableCellRenderer {

	private JLabel label = new JLabel();

	@Override
	public Component getTableCellRendererComponent(JTable table, Object conteudo, boolean selecionado,
			boolean focado, int lin, int col) {
		label.setText(String.valueOf(conteudo));
		if (col == 0) {
			label.setHorizontalAlignment(SwingConstants.CENTER);
			label.setBackground(table.getTableHeader().getBackground());
			label.setOpaque(true);
		} else {
			label.setOpaque(false);
			switch (lin) {
			case 0:
				label.setHorizontalAlignment(SwingConstants.CENTER);
				break;
			case 1:
				label.setHorizontalAlignment(SwingConstants.CENTER);
				break;
			case 2:
				label.setHorizontalAlignment(SwingConstants.CENTER);
				break;
			case 3:
				label.setHorizontalAlignment(SwingConstants.CENTER);
				break;
			case 4:
				label.setHorizontalAlignment(SwingConstants.CENTER);
				break;
			case 5:
				label.setHorizontalAlignment(SwingConstants.CENTER);
				break;
			}
		}
		return label;
	}
}

public Estoque_Modification(int id) {
	super("Modificação Estoque");
	addWindowListener(new WindowAdapter() {
		@Override
		public void windowClosing(WindowEvent arg0) {
			int key = JOptionPane.showConfirmDialog(null, "Deseja salvar as alterações?");
			if(key == JOptionPane.YES_OPTION) {
				verify();
			}else if(key == JOptionPane.NO_OPTION){
				Estoque_Modification.this.dispose();
			}
		}
	});
	setResizable(false);
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setMinimumSize(new Dimension(310, 260));
	Estoque_Modification.palets = Teste_funcs.Busca_com_id_palet_PS(id);

	JButton btnAtualizar = new JButton("Atualizar");
	btnAtualizar.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent arg0) {
			verify();
		}
	});
	btnAtualizar.setBounds(102, 181, 89, 23);

	JPanel panel = new JPanel();
	panel.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null));
	panel.setBounds(10, 28, 274, 125);

	JTable tablePallets = new JTable(new PalletTableModel());
	tablePallets.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
	tablePallets.setDefaultRenderer(Object.class, new PalletCellRenderer());
	tablePallets.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
	GroupLayout gl_panel = new GroupLayout(panel);
	gl_panel.setHorizontalGroup(
		gl_panel.createParallelGroup(Alignment.LEADING)
			.addGroup(gl_panel.createSequentialGroup()
				.addContainerGap()
				.addComponent(tablePallets, GroupLayout.DEFAULT_SIZE, 250, Short.MAX_VALUE)
				.addContainerGap())
	);
	gl_panel.setVerticalGroup(
		gl_panel.createParallelGroup(Alignment.LEADING)
			.addGroup(gl_panel.createSequentialGroup()
				.addContainerGap()
				.addComponent(tablePallets, GroupLayout.DEFAULT_SIZE, 98, Short.MAX_VALUE)
				.addContainerGap())
	);
	panel.setLayout(gl_panel);
	getContentPane().setLayout(null);
	getContentPane().add(btnAtualizar);
	getContentPane().add(panel);

	JMenuBar menuBar = new JMenuBar();
	menuBar.setBounds(0, 0, 304, 21);
	getContentPane().add(menuBar);

	JMenu mnRetornar = new JMenu("Retornar");
	mnRetornar.addMouseListener(new MouseAdapter() {
		@Override
		public void mouseClicked(MouseEvent arg0) {
			Estoque_Modification.this.dispose();
		}
	});
	menuBar.add(mnRetornar);
}

public void verify() {
	Palet palet = Estoque_Modification.palets.get(0);
	Palet_freezer_DB.update_palet_Prepared_Statement(palet);
	Estoque_Modification.this.dispose();
}
}

class PalletTableModel extends AbstractTableModel {

// a JTable chama este método pra saber se a célula informada pelos parametros
// lin e col pode ser editada ou não
@Override
public boolean isCellEditable(int lin, int col) {
	if (col == 0 || lin == 0) { // os campos da coluna 0 são o "cabeçalho" da nossa table, então não
											// pode editar
		return false;
	}
	return true; // as células das outras coluna pode editar
}

private static final long serialVersionUID = 1L;

// a Jtable chama esse método pra saber quantas colunas ela tem
@Override
public int getColumnCount() {
	return 2; // uma coluna pra ser o "cabeçalho" e mais uma coluna pra cada palet da lista
}

// a Jtable chama esse método pra saber quantas linhas ela tem
@Override
public int getRowCount() {
	return 6; // uma linha pra cada atributo do pallet exceto o ID, que será o cabeçalho
}

// a Jtable chama esse método pra saber o valor a ser renderizado na linha e
// coluna informados
@Override
public Object getValueAt(int lin, int col) {
	if (col == 0) {
		switch (lin) {
		case 0:
			return "ID";
		case 1:
			return "Cerveja";
		case 2:
			return "Laço";
		case 3:
			return "Altura";
		case 4:
			return "Total";
		case 5:
			return "Última Modificação";
		}
	}
	Palet palet = Estoque_Modification.palets.get(0);

	switch (lin) {
	case 0:
		return palet.getId();
	case 1:
		return Teste_funcs.Nome_Cerveja(palet.getCerveja_id());
	case 2:
		return palet.getLaco();
	case 3:
		return palet.getAltura();
	case 4:
		return palet.getTotal();
	case 5:
		return palet.getUltima_mod();
	}
	return null;
}

// a JTable chama este método pra aplicar o valor que foi inserido na célula
// informada pelos parametros lin e col
@Override
public void setValueAt(Object conteudo, int lin, int col) {
	try {
		Palet palet = Estoque_Modification.palets.get(0);
		switch (lin) {
		case 1:
			if (Teste_funcs.Verifica_Cerveja((String) conteudo) == null) {
				JOptionPane.showMessageDialog(null, "Verifique se o nome da cerveja\n foi digitado corretamente");
			}
			break;
		case 2:
			palet.setLaco(Integer.parseInt((String) conteudo));
			break;
		case 3:
			palet.setAltura(Integer.parseInt((String) conteudo));
			break;
		case 4:
			palet.setTotal(Integer.parseInt((String) conteudo));
			break;
		case 5:
			palet.setUltima_mod(Teste_funcs.Relogio());
			break;
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
}
}

Aqui onde ele faz as buscas no BD:

public static String Verifica_Cerveja(String nome) {
	String sql = "SELECT nome FROM DB_Estoque.Cerveja where nome like ?;";

	Connection conn = Conexao.getConnection();
	List<Palet> ListaPalet = new ArrayList<>();
	try {
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.setString(1, nome);
		ResultSet rs = ps.executeQuery();
		if(rs.next()) {
			ListaPalet.add(new Palet(rs.getString("nome")));
		}else {
			return null;
		}
		Conexao.Fechar_Conexao(conn, ps);
		if(id_cerveja(ListaPalet.get(0).getNome()) == -1) {
			JOptionPane.showMessageDialog(null, "Error", "", JOptionPane.ERROR_MESSAGE);
			return null;
		}
		return "";
	} catch (SQLException e) {
		e.printStackTrace();
	}
	JOptionPane.showMessageDialog(null, "Error", "", JOptionPane.ERROR_MESSAGE);
	return null;
}

public static int id_cerveja(String nome) {
	
	String sql = "SELECT id FROM DB_Estoque.Cerveja where nome like ?";
	Connection conn = Conexao.getConnection(); // Abrindo conexão
	List<Palet> ListaPalet = new ArrayList<>();

	try {
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.setString(1, nome);
		ResultSet rs = ps.executeQuery();
		if (rs.next()) {
			ListaPalet.add(new Palet(rs.getInt("id")));
		}
		Conexao.Fechar_Conexao(conn, ps, rs); // Fechando conexão
		return ListaPalet.get(0).getCerveja_id();
	} catch (SQLException e) {
		e.printStackTrace();
	}
	return -1;
	
}
}

na verdade acabei de descobrir também que tanto o nome da cerveja quanto a última modificação não estão sendo atualizados rs
então se alguem puder ajudar quanto a isso também seria ótimo

Cria um metodo para validar isso que voce precisa, depois chama ele no atualizar, acredito que seja isso que voce precisa

Eu tenho o metodo para validar, o problema é se não encontrar o nome digitado ele precisa retornar para o momento antes de o botão ser clicado

    if(!rs.first()){
       //nao existe
    } else {
       //existe
    }

qual a diferença desse para o rs.next()?
no caso eu to fazendo assim pq ai caso não encontre (oq provavelmente não vai acontecer pq na função id_cerveja ele com certeza ja vai estar com o nome)ele retorna como -1, ai na chamada da função se for recebido -1 ele mostra um JOptionPane.
no caso do verifica_cerveja ele retorna nulo caso não seja encontrado

O next() não retorna o primeiro resultado.

Então vc resolveu o problema?

Eu fiz a função que verifica o nome, só que eu to com dois problemas que o primeiro é caso não encontre, ou seja retornou null, ao invés de continuar a função verify() que é chamada quando aperta o botão e atualiza os dados ele retorne para a tabela sem precisar reescrever todos os dados, apenas para alterar o nome e escrever corretamente.

o segundo problema é que, na função verifica_cerveja e id_cerveja ele consegue imprimir os dados corretamente como o nome porém quando chega na função verify() o nome por exemplo ta como null, é como se ele perdesse os dados quando passa de uma função para a outra, o que eu não to entendendo é que isso não deveria estar acontecendo pq só tem uma variável que está sendo alterada que é

List<Palet> palets;

Aparentemente consegui resolver o problema, quando a função é chamada dentro do setValueAt ele ja deixa o aviso sem modificar as outras células, ele não estava funcionando antes por que estava criando uma outra instância desse modo não modificava a variável necessária e sim uma nova criada na função.