Boa noite!
Achei o seguinte código aqui no GUJ para criar um JComboBox com calendário:
/*
* CalendarComboBox.java
* 18/11/2009
*/
package TesteDate;
import com.sun.java.swing.plaf.motif.MotifComboBoxUI;
import com.sun.java.swing.plaf.windows.WindowsComboBoxUI;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.plaf.ComboBoxUI;
import javax.swing.plaf.basic.BasicComboBoxEditor;
import javax.swing.plaf.basic.BasicComboBoxUI;
import javax.swing.plaf.basic.BasicComboPopup;
import javax.swing.plaf.basic.ComboPopup;
import javax.swing.plaf.metal.MetalComboBoxUI;
import javax.swing.text.MaskFormatter;
public class CalendarComboBox extends JComboBox {
private boolean showActualDate;
private DatePopup datePopup;
private JFormattedTextField formattedTextField;
public CalendarComboBox() {
this(true);
}
public CalendarComboBox(boolean showActualDate) {
/* 'showActualDate': indica que, quando a caixa de texto for (re)inicializada, o campo deve ou nao exibir a data atual. */
super();
this.showActualDate = showActualDate;
MaskFormatter formatter = null;
try {
formatter = new MaskFormatter("##/##/####");
formatter.setPlaceholderCharacter('_');
} catch (ParseException e) {
}
formattedTextField = new JFormattedTextField(formatter);
formattedTextField.setBorder(((JComponent) getEditor().getEditorComponent()).getBorder());
if (showActualDate) {
formattedTextField.setValue(getTime());
} else {
formattedTextField.setValue("");
}
formattedTextField.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent evt) {
setValue();
}
});
setEditor(new BasicComboBoxEditor() {
@Override
public Component getEditorComponent() {
return formattedTextField;
}
});
super.setEditable(true);
}
private String getTime() {
return new SimpleDateFormat("dd/MM/yyyy").format(Calendar.getInstance().getTime());
}
private boolean isValidDate(String source) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
sdf.setLenient(false);
sdf.parse(source);
return true;
} catch (ParseException e) {
return false;
}
}
private class MetalDateComboBoxUI extends MetalComboBoxUI {
@Override
protected ComboPopup createPopup() {
datePopup = new DatePopup();
return datePopup;
}
}
private class WindowsDateComboBoxUI extends WindowsComboBoxUI {
@Override
protected ComboPopup createPopup() {
datePopup = new DatePopup();
return datePopup;
}
}
private class MotifDateComboBoxUI extends MotifComboBoxUI {
@Override
protected ComboPopup createPopup() {
datePopup = new DatePopup();
return datePopup;
}
}
private class BasicDateComboBoxUI extends BasicComboBoxUI {
@Override
protected ComboPopup createPopup() {
datePopup = new DatePopup();
return datePopup;
}
}
private class DatePopup extends BasicComboPopup {
private DatePanel datePanel;
public DatePopup() {
super(CalendarComboBox.this);
removeAll();
}
public void constructDatePopup() {
removeAll();
setPreferredSize(new java.awt.Dimension(192, 142));
setBorder(BorderFactory.createLineBorder(Color.BLACK));
setLayout(new GridLayout(1, 1));
datePanel = new DatePanel();
if (hasValidDate()) {
datePanel.prepareDate();
} else {
datePanel.prepare(false, false, false, false);
}
add(datePanel);
}
@Override
public void show(Component invoker, int x, int y) {
constructDatePopup();
super.show(CalendarComboBox.this, CalendarComboBox.this.getWidth() - 193, CalendarComboBox.this.getHeight());
}
@Override
public void setVisible(boolean b) {
if (b == false) {
setValue();
datePanel.stopTimer();
datePanel = null;
}
super.setVisible(b);
}
}
private class DatePanel extends javax.swing.JPanel {
private GregorianCalendar gc;
private Timer timer;
private JLabel[] day;
private String[] month;
private JLabel selectedLabel;
private int timerFlag = 0;
private int dayOfMonth = 0;
private int selectedDay = 0;
private boolean pressed = false;
private static final int TIME_FROZEN = 3;
public DatePanel() {
initComponents();
gc = new GregorianCalendar();
nextYear.addMouseListener(new java.awt.event.MouseAdapter() {
@Override
public void mousePressed(java.awt.event.MouseEvent evt) {
nextYear.setBorder(BorderFactory.createLoweredBevelBorder());
if (SwingUtilities.isLeftMouseButton(evt)) {
initTimer(true, false, true, false);
}
}
@Override
public void mouseReleased(java.awt.event.MouseEvent evt) {
nextYear.setBorder(BorderFactory.createRaisedBevelBorder());
if (SwingUtilities.isLeftMouseButton(evt)) {
terminateTimer();
if (timerFlag <= TIME_FROZEN) {
prepare(true, false, true, false);
}
timerFlag = 0;
}
}
});
nextMonth.addMouseListener(new java.awt.event.MouseAdapter() {
@Override
public void mousePressed(java.awt.event.MouseEvent evt) {
nextMonth.setBorder(BorderFactory.createLoweredBevelBorder());
if (SwingUtilities.isLeftMouseButton(evt)) {
initTimer(false, true, true, false);
}
}
@Override
public void mouseReleased(java.awt.event.MouseEvent evt) {
nextMonth.setBorder(BorderFactory.createRaisedBevelBorder());
if (SwingUtilities.isLeftMouseButton(evt)) {
terminateTimer();
if (timerFlag <= TIME_FROZEN) {
prepare(false, true, true, false);
}
timerFlag = 0;
}
}
});
previousMonth.addMouseListener(new java.awt.event.MouseAdapter() {
@Override
public void mousePressed(java.awt.event.MouseEvent evt) {
previousMonth.setBorder(BorderFactory.createLoweredBevelBorder());
if (SwingUtilities.isLeftMouseButton(evt)) {
initTimer(false, true, false, false);
}
}
@Override
public void mouseReleased(java.awt.event.MouseEvent evt) {
previousMonth.setBorder(BorderFactory.createRaisedBevelBorder());
if (SwingUtilities.isLeftMouseButton(evt)) {
terminateTimer();
if (timerFlag <= TIME_FROZEN) {
prepare(false, true, false, false);
}
timerFlag = 0;
}
}
});
previousYear.addMouseListener(new java.awt.event.MouseAdapter() {
@Override
public void mousePressed(java.awt.event.MouseEvent evt) {
previousYear.setBorder(BorderFactory.createLoweredBevelBorder());
if (SwingUtilities.isLeftMouseButton(evt)) {
initTimer(true, false, false, false);
}
}
@Override
public void mouseReleased(java.awt.event.MouseEvent evt) {
previousYear.setBorder(BorderFactory.createRaisedBevelBorder());
if (SwingUtilities.isLeftMouseButton(evt)) {
terminateTimer();
if (timerFlag <= TIME_FROZEN) {
prepare(true, false, false, false);
}
timerFlag = 0;
}
}
});
month = new String[]{"Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro",
"Outubro", "Novembro", "Dezembro"
};
day = new JLabel[42];
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">
private void initComponents() {
navegatePanel = new javax.swing.JPanel();
previousYear = new javax.swing.JLabel();
previousMonth = new javax.swing.JLabel();
dateLabel = new javax.swing.JLabel();
nextMonth = new javax.swing.JLabel();
nextYear = new javax.swing.JLabel();
weekAndDaysPanel = new javax.swing.JPanel();
weekPanel = new javax.swing.JPanel();
sundayLabel = new javax.swing.JLabel();
mondayLabel = new javax.swing.JLabel();
tuesdayLabel = new javax.swing.JLabel();
wednesdayLabel = new javax.swing.JLabel();
thursdayLabel = new javax.swing.JLabel();
fridayLabel = new javax.swing.JLabel();
saturdayLabel = new javax.swing.JLabel();
daysPanel = new javax.swing.JPanel();
setLayout(new java.awt.BorderLayout());
navegatePanel.setLayout(null);
navegatePanel.setPreferredSize(new java.awt.Dimension(20, 20));
previousYear.setFont(new java.awt.Font("Arial", 0, 9));
previousYear.setText("<<");
previousYear.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
previousYear.setBorder(javax.swing.BorderFactory.createRaisedBevelBorder());
navegatePanel.add(previousYear);
previousYear.setBounds(0, 0, 20, 20);
previousMonth.setFont(new java.awt.Font("Arial", 0, 9));
previousMonth.setText("<");
previousMonth.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
previousMonth.setBorder(javax.swing.BorderFactory.createRaisedBevelBorder());
navegatePanel.add(previousMonth);
previousMonth.setBounds(20, 0, 20, 20);
dateLabel.setFont(new java.awt.Font("Tahoma", 1, 11));
dateLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
dateLabel.setText("Abril, 2006");
navegatePanel.add(dateLabel);
dateLabel.setBounds(45, 3, 100, 14);
nextMonth.setFont(new java.awt.Font("Arial", 0, 9));
nextMonth.setText(">");
nextMonth.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
nextMonth.setBorder(javax.swing.BorderFactory.createRaisedBevelBorder());
navegatePanel.add(nextMonth);
nextMonth.setBounds(150, 0, 20, 20);
nextYear.setFont(new java.awt.Font("Arial", 0, 9));
nextYear.setText(">>");
nextYear.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
nextYear.setBorder(javax.swing.BorderFactory.createRaisedBevelBorder());
navegatePanel.add(nextYear);
nextYear.setBounds(170, 0, 20, 20);
add(navegatePanel, java.awt.BorderLayout.NORTH);
weekAndDaysPanel.setLayout(new java.awt.BorderLayout());
weekAndDaysPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
weekPanel.setLayout(new java.awt.GridLayout(1, 7));
weekPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
weekPanel.setPreferredSize(new java.awt.Dimension(20, 20));
sundayLabel.setForeground(new java.awt.Color(255, 0, 0));
sundayLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
sundayLabel.setText("D");
weekPanel.add(sundayLabel);
mondayLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
mondayLabel.setText("S");
weekPanel.add(mondayLabel);
tuesdayLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
tuesdayLabel.setText("T");
weekPanel.add(tuesdayLabel);
wednesdayLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
wednesdayLabel.setText("Q");
weekPanel.add(wednesdayLabel);
thursdayLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
thursdayLabel.setText("Q");
weekPanel.add(thursdayLabel);
fridayLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
fridayLabel.setText("S");
weekPanel.add(fridayLabel);
saturdayLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
saturdayLabel.setText("S");
weekPanel.add(saturdayLabel);
weekAndDaysPanel.add(weekPanel, java.awt.BorderLayout.NORTH);
daysPanel.setLayout(new java.awt.GridLayout(6, 7));
daysPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));
daysPanel.setPreferredSize(new java.awt.Dimension(95, 95));
weekAndDaysPanel.add(daysPanel, java.awt.BorderLayout.CENTER);
add(weekAndDaysPanel, java.awt.BorderLayout.CENTER);
}// </editor-fold>
private void initTimer(final boolean b1, final boolean b2, final boolean b3, final boolean b4) {
timer = new Timer(100, new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
if (timerFlag > TIME_FROZEN) {
prepare(b1, b2, b3, b4);
} else {
timerFlag++;
}
}
});
timer.start();
}
private void terminateTimer() {
timer.stop();
timer = null;
}
private void initArrayOfDays() {
for (int i = 0; i < 42; i++) {
day[i] = new JLabel();
day[i].setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
day[i].setOpaque(true);
day[i].setBackground(Color.WHITE);
}
}
private void fillDaysPanel(int firstDayOfMonth, int maximumDayOfMonth) {
int index = 1;
daysPanel.removeAll();
initArrayOfDays();
for (int i = 0; i < 42; i++) {
if (i + 1 >= firstDayOfMonth && index <= maximumDayOfMonth) {
day[i].setText(String.valueOf(index));
day[i].setBorder(BorderFactory.createEmptyBorder());
if (index == selectedDay || index == dayOfMonth) {
day[i].setBorder(BorderFactory.createLoweredBevelBorder());
if (index == selectedDay) {
day[i].setBackground(Color.GRAY);
day[i].setForeground(Color.WHITE);
selectedLabel = day[i];
} else {
if (i % 7 != 0) {
day[i].setForeground(UIManager.getDefaults().getColor("label.foreground"));
} else {
day[i].setForeground(Color.RED);
}
}
} else {
if (day[i].getText().equals(String.valueOf(selectedDay))) {
day[i].setBackground(Color.GRAY);
day[i].setForeground(Color.WHITE);
selectedLabel = day[i];
}
if (day[i] != selectedLabel) {
if (i % 7 != 0) {
day[i].setForeground(UIManager.getDefaults().getColor("label.foreground"));
} else {
day[i].setForeground(Color.RED);
}
}
}
final int finalI = i;
index++;
day[i].addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent evt) {
if (SwingUtilities.isLeftMouseButton(evt)) {
configureDayLabels(day[finalI]);
pressed = true;
}
}
@Override
public void mouseEntered(MouseEvent evt) {
if (SwingUtilities.isLeftMouseButton(evt) && pressed) {
configureDayLabels(day[finalI]);
}
}
@Override
public void mouseReleased(MouseEvent evt) {
if (SwingUtilities.isLeftMouseButton(evt)) {
if (getMousePosition() != null) {
datePopup.hide();
DecimalFormat df = new DecimalFormat("00");
String dayText = df.format(selectedDay);
String monthText = df.format(gc.get(Calendar.MONTH) + 1);
String yearText = String.valueOf(gc.get(Calendar.YEAR));
formattedTextField.setValue(dayText + "/" + monthText + "/" + yearText);
}
pressed = false;
}
}
});
}
daysPanel.add(day[i]);
}
}
private void setDaysAndFill() {
gc.set(Calendar.DAY_OF_MONTH, 1);
int firstDayOfMonth = gc.get(Calendar.DAY_OF_WEEK);
int maximumDayOfMonth = gc.getActualMaximum(Calendar.DAY_OF_MONTH);
gc.set(Calendar.DAY_OF_MONTH, dayOfMonth);
String monthText = month[gc.get(Calendar.MONTH)];
dateLabel.setText(String.valueOf(monthText + ", " + gc.get(Calendar.YEAR)));
fillDaysPanel(firstDayOfMonth, maximumDayOfMonth);
}
private void configureDayLabels(JLabel day) {
if (!selectedLabel.getText().equals(String.valueOf(dayOfMonth))) {
selectedLabel.setBorder(BorderFactory.createEmptyBorder());
}
selectedLabel.setBackground(Color.WHITE);
gc.set(Calendar.DAY_OF_MONTH, Integer.parseInt(selectedLabel.getText()));
if (gc.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {
selectedLabel.setForeground(UIManager.getDefaults().getColor("label.foreground"));
} else {
selectedLabel.setForeground(Color.RED);
}
gc.set(Calendar.DAY_OF_MONTH, dayOfMonth);
day.setBorder(BorderFactory.createLoweredBevelBorder());
day.setBackground(Color.GRAY);
day.setForeground(Color.WHITE);
selectedLabel = day;
selectedDay = Integer.parseInt(selectedLabel.getText());
}
public void prepare(boolean rollYear, boolean rollMonth, boolean up, boolean instantiateGc) {
if (instantiateGc) {
gc = new GregorianCalendar();
}
dayOfMonth = gc.get(Calendar.DAY_OF_MONTH);
if (selectedDay == 0 || instantiateGc) {
selectedDay = dayOfMonth;
}
if (rollYear) {
gc.roll(Calendar.YEAR, up);
}
if (rollMonth) {
if ((up && gc.get(Calendar.MONTH) == Calendar.DECEMBER) || (!up && gc.get(Calendar.MONTH) == Calendar.JANUARY)) {
gc.roll(Calendar.YEAR, up);
}
gc.roll(Calendar.MONTH, up);
}
setDaysAndFill();
}
public void prepareDate() {
if (hasValidDate()) {
int d = Integer.parseInt(formattedTextField.getValue().toString().substring(0, 2));
int m = Integer.parseInt(formattedTextField.getValue().toString().substring(3, 5)) - 1;
int y = Integer.parseInt(formattedTextField.getValue().toString().substring(6));
dayOfMonth = gc.get(Calendar.DAY_OF_MONTH);
selectedDay = d;
gc.set(Calendar.MONTH, m);
gc.set(Calendar.YEAR, y);
setDaysAndFill();
} else {
prepare(false, false, false, true);
}
}
public void stopTimer() {
if (timer != null) {
timer.stop();
}
}
private javax.swing.JLabel dateLabel;
private javax.swing.JPanel daysPanel;
private javax.swing.JLabel fridayLabel;
private javax.swing.JLabel mondayLabel;
private javax.swing.JPanel navegatePanel;
private javax.swing.JLabel nextMonth;
private javax.swing.JLabel nextYear;
private javax.swing.JLabel previousMonth;
private javax.swing.JLabel previousYear;
private javax.swing.JLabel saturdayLabel;
private javax.swing.JLabel sundayLabel;
private javax.swing.JLabel thursdayLabel;
private javax.swing.JLabel tuesdayLabel;
private javax.swing.JLabel wednesdayLabel;
private javax.swing.JPanel weekAndDaysPanel;
private javax.swing.JPanel weekPanel;
}
private void setValue() {
if (isValidDate(formattedTextField.getText())) {
formattedTextField.setValue(formattedTextField.getText());
} else {
formattedTextField.setText(formattedTextField.getValue().toString());
}
}
@Override
public void updateUI() {
ComboBoxUI comboBoxUI = (ComboBoxUI) UIManager.getUI(CalendarComboBox.this);
if (comboBoxUI instanceof MetalComboBoxUI) {
comboBoxUI = new MetalDateComboBoxUI();
} else if (comboBoxUI instanceof MotifComboBoxUI) {
comboBoxUI = new MotifDateComboBoxUI();
} else if (comboBoxUI instanceof WindowsComboBoxUI) {
comboBoxUI = new WindowsDateComboBoxUI();
} else if (comboBoxUI instanceof BasicComboBoxUI) {
comboBoxUI = new BasicDateComboBoxUI();
}
setUI(comboBoxUI);
}
@Override
public boolean selectWithKeyChar(char keyChar) {
return false;
}
@Override
public void setEditable(boolean aFlag) {
if (!aFlag) {
throw new IllegalArgumentException("no sense in setting editable mode to false");
}
}
@Override
public Object getSelectedItem() {
super.setSelectedItem(null);
int d = Integer.parseInt(formattedTextField.getValue().toString().substring(0, 2));
int m = Integer.parseInt(formattedTextField.getValue().toString().substring(3, 5)) - 1;
int y = Integer.parseInt(formattedTextField.getValue().toString().substring(6));
GregorianCalendar gc = new GregorianCalendar();
gc.set(Calendar.DAY_OF_MONTH, d);
gc.set(Calendar.MONTH, m);
gc.set(Calendar.YEAR, y);
return gc;
}
@Override
public void setSelectedItem(Object anObject) {
if (anObject != null) {
if (anObject instanceof GregorianCalendar) {
String dayText = String.valueOf(((GregorianCalendar) anObject).get(Calendar.DAY_OF_MONTH));
String monthText = String.valueOf(((GregorianCalendar) anObject).get(Calendar.MONTH));
String yearText = String.valueOf(((GregorianCalendar) anObject).get(Calendar.YEAR));
formattedTextField.setValue(dayText + "/" + monthText + "/" + yearText);
} else {
super.setSelectedItem(null);
throw new IllegalArgumentException("invalid date");
}
} else {
if (showActualDate) {
formattedTextField.setValue(getTime());
} else {
formattedTextField.setValue("");
}
}
super.setSelectedItem(null);
}
public boolean hasValidDate() {
return isValidDate(formattedTextField.getValue().toString());
}
public String getText() {
return formattedTextField.getText();
}
}
Só que ocorre um erro quando quero pesquisar no meu banco:
private void pesquisaData() throws SQLException, ParseException {
TesteDateDao dao = new TesteDateDao();
SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date data = formatador.parse((String) cbPesquisaInicio.getSelectedItem());
testeDate = dao.getLista(data);
mostraPesquisa(testeDate);
}
// Este erro
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.util.GregorianCalendar cannot be cast to java.lang.String
Como posso corrigi-lo?
Obrigado pela ajuda!