Problema com eventos em Jbutton

Olá pessoal, minha primeira mensagem aqui no fórum e preciso mesmo da ajuda de vocês, não estou encontrando o problema do meu código.
O que estou tentando fazer é o seguinte:

  • Tenho uma tabela e criei para uma coluna de data um cellEditor que é um botão.

cellPluEditors.add(new GDCalendarCellEditor(contextUtilities.getMainFrame())); describer.getEditor().getTable().getColumnModel().getColumn(1).setCellEditor(cellPluEditors.get(0));

  • A classe editora criada está feita deste modo:

[code]package georisco.client.applications.geodados;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.Date;

import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;

public class GDCalendarCellEditor extends AbstractCellEditor implements
TableCellEditor {

private Date date;
private JDialog dialog;
private Dimension DEFAULT_DIALOG_DIMENSION = new Dimension(250, 126);
private JFrame frame;
private JPanel panel = new JPanel();

private CalendarPopup dateChooser =
new CalendarPopup(LNG.get(“generics.reading.date”), true, 0, true);

private JButton buttonCalendar = new JButton(LNG.get(“generics.calendar”));

private JButton buttonCancel = new JButton(LNG.get(“generics.cancel”));

private JButton buttonAdd = new JButton(LNG.get(“generics.add”));

public GDCalendarCellEditor(JFrame mainFrame) {
frame = mainFrame;
}

/**

  • {@inheritDoc}
    */
    public Component getTableCellEditorComponent(JTable table, Object value,
    boolean isSelected, int row, int column) {
buttonCalendar.addActionListener(new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent arg0) {
    System.out.println("botao calendario chamou calendarDialog");
    calendarDialog();
  }
});

return buttonCalendar;

}

/**

  • {@inheritDoc}
    */
    public Object getCellEditorValue() {
    System.out.println(“getCellEditorValue”);
    return GRUtil.dateToString(date, GRUtil.DEFAULT_DATE_FORMAT);
    }

public void calendarDialog() {

buttonAdd.addActionListener(new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent arg0) {
    System.out.println("botao adicionar pegou data");
    date = dateChooser.getDate();
    dialog.setVisible(false);
  }
});

buttonCancel.addActionListener(new ActionListener() {

  @Override
  public void actionPerformed(ActionEvent e) {
    System.out.println("botao cancelar cancelou edicao");
    cancelCellEditing();
    dialog.setVisible(false);
  }
});

dialog = new JDialog(frame);
dialog.addWindowListener(new WindowListener() {

  @Override
  public void windowActivated(WindowEvent e) {
    // TODO Auto-generated method stub

  }

  @Override
  public void windowClosed(WindowEvent e) {
    cancelCellEditing();
  }

  @Override
  public void windowClosing(WindowEvent e) {
    // TODO Auto-generated method stub

  }

  @Override
  public void windowDeactivated(WindowEvent e) {
    // TODO Auto-generated method stub

  }

  @Override
  public void windowDeiconified(WindowEvent e) {
    // TODO Auto-generated method stub

  }

  @Override
  public void windowIconified(WindowEvent e) {
    // TODO Auto-generated method stub

  }

  @Override
  public void windowOpened(WindowEvent e) {
    // TODO Auto-generated method stub

  }
});

panel.add(buttonAdd, BorderLayout.WEST);
panel.add(buttonCancel, BorderLayout.EAST);

dialog.getContentPane().add(dateChooser, BorderLayout.NORTH);
dialog.getContentPane().add(panel, BorderLayout.SOUTH);

dialog.setLocationRelativeTo(buttonCalendar);
dialog.setSize(DEFAULT_DIALOG_DIMENSION);
dialog.setTitle(LNG.get("filter.select.calendar"));
dialog.setResizable(false);
dialog.setModalityType(JDialog.ModalityType.DOCUMENT_MODAL);
dialog.setVisible(true);

}
}[/code]

  • O problema é que quando seleciono a data a primeira vez o calendário funciona normal, mas se eu quiser selecionar outra data o diálogo aparece mas ao clicar adicionar, este ultimo fecha mas abre outro logo em seguida.

Com os meus System.out.println pude constatar isso vendo os passos que ele esteve fazendo:

primeira seleção da data:

[quote]botao calendario chamou calendarDialog
botao adicionar pegou data
getCellEditorValue[/quote]

segunda seleção da data:

[quote]botao calendario chamou calendarDialog
botao adicionar pegou data
botao adicionar pegou data
botao calendario chamou calendarDialog
botao adicionar pegou data
botao adicionar pegou data
botao adicionar pegou data
getCellEditorValue[/quote]

O comportamento esperado é o mais simples possível:

  • abrir o diálogo de calendário selecionar, pegar a data e aparecer na célula. E não entrar nesse loop estranho de diálogos aparecendo.

Devo estar fazendo errado a seleção do evento que deveria ocorrer, porque a janela está voltando a aparecer.
Espero ter explicado direitinho o problema, qualquer dúvida quanto ao funcionamento é só me dizer que tento explicar melhor.

Muito obrigado,
Paolo.