Fazer uma ação no frame após modificar a tabela

Estou quebrando a cabeça a um tempinho, não estou conseguindo achar uma solução, eu fiz um frame que contêm uma tabela, e queria criar um listener que quando fosse modificado alguma celula criasse um JOptionPane de WindowClosing perguntando se o usuário gostaria de salvar as alterações ou não.

O maximo que eu consegui foi fazer com que um botão “Atualizar” ficasse ativado (enquanto não for feita uma alteração na tabela ele não poderar ser usado) pelo setValueAt da Jtable, tentei criar um windowListener dentro dessa função, mas como são classes diferentes (TableModel) não funciona.

Vc implementou sua própria tableModel ou está usando DefaultTableModel?

implementei, vou mandar o código.

import java.awt.*;
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<>();
protected static JButton btnAtualizar;
private static int id = 1;

public static int getId() {
	return id;
}

public void setId(int id) {
	Estoque_Modification.id = id;
}

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(Estoque_Modification.getId());

	tela.setLocationRelativeTo(null);
	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.DO_NOTHING_ON_CLOSE);
	setMinimumSize(new Dimension(310, 260));
	Estoque_Modification.palets = Teste_funcs.Busca_com_id_palet_PS(id);

	btnAtualizar = new JButton("Atualizar");
	btnAtualizar.setEnabled(false);
	btnAtualizar.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
	btnAtualizar.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent arg0) {
			verify();
		}
	});
	btnAtualizar.setBounds(102, 181, 89, 23);
	btnAtualizar.getActionListeners();
	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.setUltima_mod(Teste_funcs.Relogio());
	Palet_freezer_DB.update_palet_Prepared_Statement(palet);
	Estoque_Modification.this.dispose();
}

}

class Pallet_Mod_TableModel extends AbstractTableModel{

@Override
public boolean isCellEditable(int lin, int col) {
	if (col == 0 || lin == 0 || lin == 5) { // os campos da coluna 0 são o "cabeçalho" da nossa table, então nãopode editar
		return false;
	}
	return true; // as células das outras coluna pode editar
}

private static final long serialVersionUID = 1L;

@Override
public int getColumnCount() {
	return 2;
}

@Override
public int getRowCount() {
	return 6;
}

// 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 Palet";
		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, Estoque_Modification.palets) == 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;
		}
		Estoque_Modification.btnAtualizar.setEnabled(true);
	} catch (Exception e) {
		e.printStackTrace();
	}
}	
}

Tu pode criar a seguinte interface:

public interface TableCellListener {
	void cellValueChanged();
}

Crie na sua model uma lista para esse listener e um método add para ele:

private List<TableCellListener> tableCellListeners = new ArrayList<>();

public void addTableCellListener(TableCellListener listener) {
    tableCellListeners.add(listener);
}

e no método setValueAt faça:

for (TableCellListener listener : tableCellListeners) {
    listener.cellValueChanged();
}

// se estiver usando java 8+
tableCellListeners.forEach(TableCellListener::cellValueChanged);

Na sua tela, vc terá algo assim:

seuTableModel.addTableCellListener(new TableCellListener() {
    public void cellValueChanged() {
        // código será executado quando os valores das colunas forem alterados
    }
});

// se estiver usando java 8+
seuTableModel.addTableCellListener(() -> // código será executado quando os valores das colunas forem alterados);

Vc pode incrementar a interface passando o novo valor que a coluna está recebendo, ou o registro da linha que foi alterado

Valeu, funcionou !

Estava fazendo uns retoques no código e percebi que está acontecendo alguma coisa meio estranha, quando eu faço uma modificação no nome ou id funciona normal, porém para os outros elementos como por exemplo distribuidor ou preço, está acontecendo de as vezes não ocorrer a modificação e também acontece de o actionPerformed do botão (a função “verify()”) estar sendo ativado duas vezes, o que pode estar causando isso??

atualmente o codigo está assim:

public class Alterar_Cervejas extends JFrame {

private static final long serialVersionUID = 1L;
protected static List<Palet> Cervejas = new ArrayList<>();
private static int id = 1;

public static int getId() {
	return id;
}

public void setId(int id) {
	Alterar_Cervejas.id = id;
}

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);
	}

	Alterar_Cervejas tela = new Alterar_Cervejas();

	tela.setLocationRelativeTo(null);
	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 Alterar_Cervejas() {
	super("Alterar Cervejas");
	setMaximumSize(new Dimension(690, 280));
	setResizable(false);
	setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	setMinimumSize(new Dimension(690, 280));
	Alterar_Cervejas.Cervejas = carregarCervejas();
	JPanel panel = new JPanel();
	panel.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null));

	JScrollPane scrollPane = new JScrollPane();
	scrollPane.setBounds(12, 13, 642, 139);

	JTable table_1 = new JTable(new Cerveja_A_TableModel());
	table_1.setRowSelectionAllowed(false);
	table_1.setBounds(0, 0, 248, 154);
	table_1.setDefaultRenderer(Object.class, new PalletCellRenderer());
	table_1.getColumnModel().getColumn(0).setMaxWidth(30);
	table_1.getColumnModel().getColumn(1).setMaxWidth(100);
	table_1.getColumnModel().getColumn(2).setMaxWidth(100);
	table_1.getColumnModel().getColumn(3).setMaxWidth(50);
	table_1.getColumnModel().getColumn(4).setMaxWidth(50);
	table_1.getColumnModel().getColumn(5).setMaxWidth(400);
	scrollPane.setViewportView(table_1);
	
	JButton btnAtualizar = new JButton("Atualizar");
	btnAtualizar.setEnabled(false);
			
	Cerveja_A_TableModel.addTableCellListener(() -> {
					
		int i = table_1.getEditingRow();
		
		Alterar_Cervejas.this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		
		btnAtualizar.setEnabled(true);
		btnAtualizar.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		btnAtualizar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				verify(i);
			}
		});
		
		addWindowListener(new WindowAdapter() {
			
			@Override
			public void windowClosing(WindowEvent e) {

				int key = JOptionPane.showConfirmDialog(null, "Deseja salvar as alterações?");
				if (key == JOptionPane.YES_OPTION) {
					verify(i);
				} else if (key == JOptionPane.NO_OPTION) {
					Estoque_Visualization.contador = 0;
//						Estoque_Visualization frame = new Estoque_Visualization();
//						frame.setExtendedState(MAXIMIZED_BOTH);
//						frame.setVisible(true);
					Alterar_Cervejas.this.dispose();
				}
			}
		});
	});

	JMenuBar menuBar = new JMenuBar();

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

	
	GroupLayout groupLayout = new GroupLayout(getContentPane());
	groupLayout.setHorizontalGroup(
		groupLayout.createParallelGroup(Alignment.LEADING)
			.addComponent(menuBar, GroupLayout.DEFAULT_SIZE, 484, Short.MAX_VALUE)
			.addGroup(groupLayout.createSequentialGroup()
				.addGap(10)
				.addComponent(panel, GroupLayout.DEFAULT_SIZE, 464, Short.MAX_VALUE)
				.addGap(10))
			.addGroup(groupLayout.createSequentialGroup()
				.addGap(305)
				.addComponent(btnAtualizar)
				.addContainerGap(304, Short.MAX_VALUE))
	);
	groupLayout.setVerticalGroup(
		groupLayout.createParallelGroup(Alignment.LEADING)
			.addGroup(groupLayout.createSequentialGroup()
				.addComponent(menuBar, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
				.addGap(12)
				.addComponent(panel, GroupLayout.DEFAULT_SIZE, 164, Short.MAX_VALUE)
				.addGap(18)
				.addComponent(btnAtualizar)
				.addGap(14))
	);
	panel.setLayout(null);
	panel.add(scrollPane);
	getContentPane().setLayout(groupLayout);

}

public void verify(int i) {
	Palet palet = Alterar_Cervejas.Cervejas.get(i);
	palet.setUltima_mod(Teste_funcs.Relogio());
	Teste_funcs.Atualizar_Cerveja(palet);
	Estoque_Visualization.contador = 0;
	Alterar_Cervejas.this.dispose();
}

private List<Palet> carregarCervejas() {
	List<Palet> pallets = new ArrayList<>();
	Teste_funcs.listar_Cerveja_PS(pallets);
	return pallets;
}
}

class Cerveja_A_TableModel extends AbstractTableModel {

private static final long serialVersionUID = 1L;

@Override
public boolean isCellEditable(int lin, int col) {
	if (lin >= 0 && (col == 1 || col == 2 || col == 3)) {
		return true;
	}
	return false; // as células das outras coluna pode editar
}

// a Jtable chama esse método pra saber quantas colunas ela tem
@Override
public int getColumnCount() {
	return 6;
}

// a Jtable chama esse método pra saber quantas linhas ela tem
@Override
public int getRowCount() {
	return Alterar_Cervejas.Cervejas.size();
}

@Override
public String getColumnName(int column) {
	// TODO Auto-generated method stub
	switch (column) {
	case 0:
		return "ID";
	case 1:
		return "Nome";
	case 2:
		return "Distribuidor";
	case 3:
		return "Preço";
	case 4:
		return "Total";
	case 5:
		return "Última Modificação";
	}
	return super.getColumnName(column);
}

// 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) {
	switch (col) {
	case 0:
		return Alterar_Cervejas.Cervejas.get(lin).getId();
	case 1:
		return Alterar_Cervejas.Cervejas.get(lin).getNome();
	case 2:
		return Alterar_Cervejas.Cervejas.get(lin).getDistribuidor();
	case 3:
		return Alterar_Cervejas.Cervejas.get(lin).getPreco();
	case 4:
		return Alterar_Cervejas.Cervejas.get(lin).getTotal_cerveja();
	case 5:
		return Alterar_Cervejas.Cervejas.get(lin).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 = Alterar_Cervejas.Cervejas.get(0);
		switch (col) {
		case 1:
			palet.setNome((String) conteudo);
			break;
		case 2:
			palet.setDistribuidor((String) conteudo);
			break;
		case 3:
			palet.setPreco(Float.parseFloat((String) conteudo));
			break;
		}
		tableCellListeners.forEach(TableCellListener::cellValueChanged);
	} catch (Exception e) {
		e.printStackTrace();
	}
}

private static List<TableCellListener> tableCellListeners = new ArrayList<>();

public interface TableCellListener {
	void cellValueChanged();
}

public static void addTableCellListener(TableCellListener listener) {
	tableCellListeners.add(listener);
}
 }

Tu não pode fazer isso aqui não:

Cerveja_A_TableModel.addTableCellListener(() -> {
					
	int i = table_1.getEditingRow();

	Alterar_Cervejas.this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

	btnAtualizar.setEnabled(true);
	btnAtualizar.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
	btnAtualizar.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent arg0) {
			verify(i);
		}
	});

	addWindowListener(new WindowAdapter() {

		@Override
		public void windowClosing(WindowEvent e) {

			int key = JOptionPane.showConfirmDialog(null, "Deseja salvar as alterações?");
			if (key == JOptionPane.YES_OPTION) {
				verify(i);
			} else if (key == JOptionPane.NO_OPTION) {
				Estoque_Visualization.contador = 0;
//						Estoque_Visualization frame = new Estoque_Visualization();
//						frame.setExtendedState(MAXIMIZED_BOTH);
//						frame.setVisible(true);
				Alterar_Cervejas.this.dispose();
			}
		}
	});
});

Isso diz que, toda vez que vc alterar um valor na tabela, esse código será executado. E esse código, adicionar um actionListener no btnAtualizar e adiciona um windowListener ao frame. Toda mudança de valor nas colunas da tabela, significa mais listeners executando a mesma coisa N vezes.

como eu posso fazer para executar somente 1 vez?

O que exatamente vc precisa que seja executado quando um valor numa coluna da tabela seja alterado?

preciso que ele pergunte ao usuário se ele deseja salvar os dados ou não ao sair e tambem ativar o botão

Veja essa ideia:

// declare essa variavel no inicio da classe "Alterar_Cervejas", com o valor inicial "false"
private boolean tabelaAlterada = false;

// Quando uma coluna for alterada, apenas mude a variável para "true"
Cerveja_A_TableModel.addTableCellListener(() -> {
	tabelaAlterada = true;
}

// No listener da janela, verifique se "tabelaAlterada" é "true" e, se for, apresente o jOptionPane
addWindowListener(new WindowAdapter() {
	@Override
	public void windowClosing(WindowEvent e) {
		if (tabelaAlterada) {
			int key = JOptionPane.showConfirmDialog(null, "Deseja salvar as alterações?");
			if (key == JOptionPane.YES_OPTION) {
				verify(i);
			} else if (key == JOptionPane.NO_OPTION) {
				contador = 0;
	//						Estoque_Visualization frame = new Estoque_Visualization();
	//						frame.setExtendedState(MAXIMIZED_BOTH);
	//						frame.setVisible(true);
				Alterar_Cervejas.this.dispose();
			}
		}
	}
});

Agora rapaz, seu código tem muitos problemas. Um detalhe já começa no nome da classe, o ideal seria algo assim: AlterarCervejas (sem o “_”) ou AlterarCervejasUI (com UI para indicar que é uma tela).

certo, mas e no caso do botão? tentei implementar no windowListener mas da erro.

Eu entendo, ainda tenho muitas coisas pra pegar que geralmente vem com a experiência, esse é o primeiro programa pra valer que eu to fazendo.

Ah sim, saquei. Quando tu terminar de implementar o sistema, a gente pode auxiliar em como deixar o código da melhor forma possível.

Qual erro?

ele diz que é necessário fechar o addWindowListener mesmo ele estando fechado (no caso para ativar o botão, para o fechamento da janela está funcionando normal.

(Syntax error on tokens, delete these tolkens)

  addWindowListener(new WindowAdapter() {
		
		if (tabelaAlterada) {
			int i = table_1.getEditingRow();
			
			Alterar_Cervejas.this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
			
			btnAtualizar.setEnabled(true);
			btnAtualizar.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
			btnAtualizar.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					verify(i);
				}
			});
		}
		
	});

Deve ser em outra parte do código. O problema é que seu código não está com a indentação muito boa.

Manda ele completo (com esse erro de token) pra gente ver.

Na verdade eu consegui resolver, utilizei uma solução que eu tinha feito antes em outra classe que é usando um contador, quando tem uma modificação na Jtable ele acrescenta +1 e com isso eu faço um if, fica desse jeito:

Cerveja_A_TableModel.addTableCellListener(() -> {

		counter++;
		if (counter == 1) {
			int i = table_1.getEditingRow();
			
			Alterar_Cervejas.this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
			
			btnAtualizar.setEnabled(true);
			btnAtualizar.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
			btnAtualizar.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					verify(i);
				}
			});
			
			addWindowListener(new WindowAdapter() {
				
				@Override
				public void windowClosing(WindowEvent e) {

					int key = JOptionPane.showConfirmDialog(null, "Deseja salvar as alterações?");
					if (key == JOptionPane.YES_OPTION) {
						verify(i);
					} else if (key == JOptionPane.NO_OPTION) {
						Estoque_Visualization.contador = 0;
//								Estoque_Visualization frame = new Estoque_Visualization();
//								frame.setExtendedState(MAXIMIZED_BOTH);
//								frame.setVisible(true);
						Alterar_Cervejas.this.dispose();
					}
				}
			});
		}
	});  

Eu utilizei essa estratégia antes pois estava com o problema de clicar duas vezes no botão e acabavam abrindo dois frames, não estava me lembrando de usar ela nesse caso.
Quanto a isso meu problema foi solucionado, porém ainda estou com um outro problema que não estou conseguindo armazenar alguns dados especificos como por exemplo distribuidor, e eu não sei por que isso acontece sendo que é a mesma estrutura que estou utilizando para o nome, sendo que com o nome funciona.

PS: o código ta bem indentado, só que quando eu passo ele para cá fica todo desformatado, sair editando linha por linha num codigo desse tamanho vou perder um bom tempo kk

O codigo completo do Frame:

public class Alterar_Cervejas extends JFrame {

private static final long serialVersionUID = 1L;
protected static List<Palet> Cervejas = new ArrayList<>();
private static int id = 1;
private int counter = 0;

public static int getId() {
	return id;
}

public void setId(int id) {
	Alterar_Cervejas.id = id;
}

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);
	}

	Alterar_Cervejas tela = new Alterar_Cervejas();

	tela.setLocationRelativeTo(null);
	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 Alterar_Cervejas() {
	super("Alterar Cervejas");

	setMaximumSize(new Dimension(690, 280));
	setResizable(false);
	setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	setMinimumSize(new Dimension(690, 280));
	Alterar_Cervejas.Cervejas = carregarCervejas();
	JPanel panel = new JPanel();
	panel.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null));

	JScrollPane scrollPane = new JScrollPane();
	scrollPane.setBounds(12, 13, 642, 139);

	JTable table_1 = new JTable(new Cerveja_A_TableModel());
	table_1.setRowSelectionAllowed(false);
	table_1.setBounds(0, 0, 248, 154);
	table_1.setDefaultRenderer(Object.class, new PalletCellRenderer());
	table_1.getColumnModel().getColumn(0).setMaxWidth(30);
	table_1.getColumnModel().getColumn(1).setMaxWidth(100);
	table_1.getColumnModel().getColumn(2).setMaxWidth(100);
	table_1.getColumnModel().getColumn(3).setMaxWidth(50);
	table_1.getColumnModel().getColumn(4).setMaxWidth(50);
	table_1.getColumnModel().getColumn(5).setMaxWidth(400);
	scrollPane.setViewportView(table_1);

	JButton btnAtualizar = new JButton("Atualizar");
	btnAtualizar.setEnabled(false);

	Cerveja_A_TableModel.addTableCellListener(() -> {

		counter++;
		if (counter == 1) {
			int i = table_1.getEditingRow();
			
			Alterar_Cervejas.this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
			
			btnAtualizar.setEnabled(true);
			btnAtualizar.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
			btnAtualizar.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					verify(i);
				}
			});
			
			addWindowListener(new WindowAdapter() {
				
				@Override
				public void windowClosing(WindowEvent e) {

					int key = JOptionPane.showConfirmDialog(null, "Deseja salvar as alterações?");
					if (key == JOptionPane.YES_OPTION) {
						verify(i);
					} else if (key == JOptionPane.NO_OPTION) {
						Estoque_Visualization.contador = 0;
//								Estoque_Visualization frame = new Estoque_Visualization();
//								frame.setExtendedState(MAXIMIZED_BOTH);
//								frame.setVisible(true);
						Alterar_Cervejas.this.dispose();
					}
				}
			});
		}
	});

	JMenuBar menuBar = new JMenuBar();

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

	GroupLayout groupLayout = new GroupLayout(getContentPane());
	groupLayout.setHorizontalGroup(groupLayout.createParallelGroup(Alignment.LEADING)
			.addComponent(menuBar, GroupLayout.DEFAULT_SIZE, 484, Short.MAX_VALUE)
			.addGroup(groupLayout.createSequentialGroup().addGap(10)
					.addComponent(panel, GroupLayout.DEFAULT_SIZE, 464, Short.MAX_VALUE).addGap(10))
			.addGroup(groupLayout.createSequentialGroup().addGap(305).addComponent(btnAtualizar)
					.addContainerGap(304, Short.MAX_VALUE)));
	groupLayout.setVerticalGroup(groupLayout.createParallelGroup(Alignment.LEADING).addGroup(groupLayout
			.createSequentialGroup()
			.addComponent(menuBar, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
			.addGap(12).addComponent(panel, GroupLayout.DEFAULT_SIZE, 164, Short.MAX_VALUE).addGap(18)
			.addComponent(btnAtualizar).addGap(14)));
	panel.setLayout(null);
	panel.add(scrollPane);
	getContentPane().setLayout(groupLayout);

}

public void verify(int i) {
	Palet palet = Alterar_Cervejas.Cervejas.get(i);
	palet.setUltima_mod(Teste_funcs.Relogio());
	Teste_funcs.Atualizar_Cerveja(palet);
	Estoque_Visualization.contador = 0;
	Alterar_Cervejas.this.dispose();
}

private List<Palet> carregarCervejas() {
	List<Palet> pallets = new ArrayList<>();
	Teste_funcs.listar_Cerveja_PS(pallets);
	return pallets;
}
}

class Cerveja_A_TableModel extends AbstractTableModel {

private static final long serialVersionUID = 1L;

@Override
public boolean isCellEditable(int lin, int col) {
	if (lin >= 0 && (col == 1 || col == 2 || col == 3)) {
		return true;
	}
	return false; // as células das outras coluna pode editar
}

// a Jtable chama esse método pra saber quantas colunas ela tem
@Override
public int getColumnCount() {
	return 6;
}

// a Jtable chama esse método pra saber quantas linhas ela tem
@Override
public int getRowCount() {
	return Alterar_Cervejas.Cervejas.size();
}

@Override
public String getColumnName(int column) {
	// TODO Auto-generated method stub
	switch (column) {
	case 0:
		return "ID";
	case 1:
		return "Nome";
	case 2:
		return "Distribuidor";
	case 3:
		return "Preço";
	case 4:
		return "Total";
	case 5:
		return "Última Modificação";
	}
	return super.getColumnName(column);
}

// 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) {
	switch (col) {
	case 0:
		return Alterar_Cervejas.Cervejas.get(lin).getId();
	case 1:
		return Alterar_Cervejas.Cervejas.get(lin).getNome();
	case 2:
		return Alterar_Cervejas.Cervejas.get(lin).getDistribuidor();
	case 3:
		return Alterar_Cervejas.Cervejas.get(lin).getPreco();
	case 4:
		return Alterar_Cervejas.Cervejas.get(lin).getTotal_cerveja();
	case 5:
		return Alterar_Cervejas.Cervejas.get(lin).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 = Alterar_Cervejas.Cervejas.get(0);
		switch (col) {
		case 1:
			palet.setNome((String) conteudo);
			break;
		case 2:
			palet.setDistribuidor((String) conteudo);
			break;
		case 3:
			palet.setPreco(Float.parseFloat((String) conteudo));
			break;
		}
		tableCellListeners.forEach(TableCellListener::cellValueChanged);
	} catch (Exception e) {
		e.printStackTrace();
	}
}

private static List<TableCellListener> tableCellListeners = new ArrayList<>();

public interface TableCellListener {
	void cellValueChanged();
}

public static void addTableCellListener(TableCellListener listener) {
	tableCellListeners.add(listener);
}
}

As funções utilizadas(estão em uma classe separada só para funções):

 public static void Atualizar_Cerveja(Palet Cerveja) {
	
	String sql = "UPDATE `DB_Estoque`.`Cerveja` SET `nome`= ?, `distribuidor`= ? , `preco`= ? , `ultima_mod`= ? WHERE `id`= ? ;";

	Connection conn = Conexao.getConnection();

	try {
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.setString(1, Cerveja.getNome());
		ps.setString(2, Cerveja.getDistribuidor());
		ps.setFloat(3, Cerveja.getPreco());
		ps.setString(4, Cerveja.getUltima_mod());
		ps.setInt(5, Cerveja.getId());
		ps.executeUpdate();
		Conexao.Fechar_Conexao(conn, ps);
		System.out.println(Cerveja.getDistribuidor());
		JOptionPane.showMessageDialog(null, "Registro atualizado com sucesso.");
	} catch (SQLException e) {
		e.printStackTrace();
	}
	
}

public static String Relogio() {

	Date data = new Date();
	SimpleDateFormat formatar = new SimpleDateFormat("d/" + "M/" + "y " + "H:" + "m:" + "s");
	String relogio = formatar.format(data);
	/*
	 * y Year M Month m minute D Day in Year d Day in Month H Hour in day h Hour
	 * am/pm S Millisecond s Second
	 */
	return "  Modificado por " + Estoque_Visualization.getUser() + " em: "+ relogio;
}