Problema com eventos em Jbutton

0 respostas
paolobacci

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

- 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:

botao calendario chamou calendarDialog
botao adicionar pegou data
getCellEditorValue

segunda seleção da data:

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

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.

Criado 4 de setembro de 2008
Respostas 0
Participantes 1