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.