Calendário no Swing

Bom dia pessoal, estou precisando de um calendário simples, onde eu possa selecionar o dia, mês e ano. Não encontrei nada no java. Alguem pode me ajudar ?

http://nachocalendar.sourceforge.net/

sei lá…acho o nachocalendar desprovido de beleza visual. :lol:

Eu utilizo esse:

JCalendar

Bom dia a todos.

Fiz uma aplicação agenda e resolvi fazer o meu próprio calendário, segue ai o código:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.border.LineBorder;
import javax.swing.table.DefaultTableModel;

public class FrameCalendar extends JPanel implements ItemListener, MouseListener {

    private JPanel painelcombo, painelcombo1, painelcombo2, paineltable, painelcolor;
    private JComboBox jComboBox1, jComboBox2;
    private JLabel lblMes, lblAno, colortoday, colorselected, colorpast;
    private JScrollPane scroll;
    private JTable tablecalendar;
    private SelectCellTable renderer;
    private Date today, selectedday;
    private Integer day_selected, month_selected, year_selected;
    private DateFormat df;
    private Integer[] month_len = {31,28,31,30,31,30,31,31,30,31,30,31};
    private String[] month_name = {"Janeiro","Fevereiro","Março","Abril","Maio","Junho",
                           "Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"};

    public FrameCalendar(){
        initComponents();
        setLayout(new BorderLayout());
        add(painelcombo, BorderLayout.NORTH);
        add(paineltable, BorderLayout.CENTER);
        add(painelcolor, BorderLayout.SOUTH);
        setAutoscrolls(false);
        setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0), 1));
        setSize(300,106);
        jComboBox1.setSelectedIndex(today.getMonth());
        jComboBox2.setSelectedItem(today.getYear()+1900);
        validate();
    }

    private void initComponents(){
        today = new Date();
        selectedday = new Date();
        df = new SimpleDateFormat("dd/MM/yyyy");
        lblMes = new JLabel("Mês");
        lblAno = new JLabel("Ano");
        jComboBox1 = new JComboBox(month_name);
        jComboBox1.setFont(new Font("Tahoma", 0, 14));
        jComboBox1.addItemListener(this);
        jComboBox2 = new JComboBox();
        jComboBox2.setFont(new Font("Tahoma", 0, 14));
        for (int ano=1900; ano<=2099; ano++) jComboBox2.addItem(ano);
        jComboBox2.addItemListener(this);
        Object[][] conteudo = { {null, null, null, null, null, null, null},
                                {null, null, null, null, null, null, null},
                                {null, null, null, null, null, null, null},
                                {null, null, null, null, null, null, null},
                                {null, null, null, null, null, null, null},
                                {null, null, null, null, null, null, null} };
        String[] titulo = {"Dom","Seg","Ter","Qua","Qui","Sex","Sab"};
        tablecalendar = new JTable(new DefaultTableModel(conteudo,titulo));
        tablecalendar.setBorder(new LineBorder(new Color(0, 0, 0), 1, true));
        tablecalendar.setAutoscrolls(false);
        renderer = new SelectCellTable();
        tablecalendar.setDefaultRenderer(Object.class, renderer);
        tablecalendar.setCellSelectionEnabled(true);
        tablecalendar.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
        tablecalendar.addMouseListener(this);
        scroll = new JScrollPane(tablecalendar);
        scroll.setPreferredSize(new Dimension(300,115));
        painelcombo = new JPanel(new BorderLayout());
        painelcombo1 = new JPanel(new FlowLayout(1));
        painelcombo1.add(lblMes);
        painelcombo1.add(jComboBox1);
        painelcombo.add(painelcombo1, BorderLayout.WEST);
        painelcombo2 = new JPanel(new FlowLayout(1));
        painelcombo2.add(lblAno);
        painelcombo2.add(jComboBox2);
        painelcombo.add(painelcombo2, BorderLayout.EAST);
        paineltable = new JPanel(new FlowLayout(1));
        paineltable.add(scroll);
        colortoday = new JLabel("Hoje");
        colortoday.setOpaque(true);
        colortoday.setBackground(Color.BLUE);
        colortoday.setForeground(Color.WHITE);
        colorselected = new JLabel("Selecionada");
        colorselected.setOpaque(true);
        colorselected.setBackground(Color.YELLOW);
        colorselected.setForeground(Color.RED);
        colorpast = new JLabel("Ultrapassada");
        colorpast.setOpaque(true);
        colorpast.setBackground(Color.RED);
        colorpast.setForeground(Color.WHITE);
        painelcolor = new JPanel(new FlowLayout(1,5,5));
        painelcolor.add(colortoday);
        painelcolor.add(colorselected);
        painelcolor.add(colorpast);
    }

    public void setCalendar(Date data){
        clearCell();
        Integer row = 0;
        Integer col = data.getDay();
        Integer count_day = getMonth_len(data.getMonth());
        Integer ano = data.getYear()+1900;
        if (isLeapYear(ano) && count_day==28) count_day++;
        for (int i=1; i<=count_day; i++){
            tablecalendar.setValueAt(i, row, col);
            col++;
            if (col>6){
                col = 0;
                row++;
            }
            if (i==today.getDate() && data.getMonth()==today.getMonth() && data.getYear()==today.getYear()){
               renderer.setToday(i);
            } else if (data.getYear()>today.getYear()){
               renderer.setToday(0);
            } else if (data.getYear()<today.getYear()){
               renderer.setToday(32);
            } else if (data.getMonth()>today.getMonth() && data.getYear()==today.getYear()){
               renderer.setToday(0);
            } else if (data.getMonth()<today.getMonth() && data.getYear()==today.getYear()){
               renderer.setToday(32);
            }
        }
    }

    public Integer getMonth_len(Integer index) {
        return month_len[index];
    }

    private void clearCell(){
        tablecalendar.clearSelection();
        for (int row=0; row><6; row++){
            for (int col=0; col<7; col++){
                tablecalendar.setValueAt("",row,col);
            }
        }
    }

    public String getToday() {
        return df.format(today);
    }

    public Date getDateToday(){
        return today;
    }

    public String getSelectedday(){
        return df.format(selectedday);
    }

    public void setSelectedday(String selectedday) throws ParseException{
       DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");   
       Date data = (Date)formatter.parse(selectedday);
       setDateSelected(data);
    }
    
    public Date getDateSelected(){
        return selectedday;
    }

    public void setDateSelected(Date selectedday){
        this.selectedday = selectedday;
        setCalendar(selectedday);
    }
    
    // Cálculo do ano bissexto
    public Boolean isLeapYear(Integer year){
        Boolean ret = false;
        Integer resto = year % 4;
        if (resto==0){
            if ("00".equals(year.toString().substring(2))){
                resto = year % 400;
                if (resto==0) ret = true;
            } else {
                ret = true;
            }
        }
        return ret;
    }

    public Boolean isPastDay(){
        Integer ysel = getYearSelected();
        Integer ytoday = getYearOfToday();
        Integer nmsel = getNumberMonthSelected();
        Integer nmtoday = getNumberMonthOfToday();
        Integer dsel = getDaySelected();
        Integer dtoday = getDayOfToday();
        if (ysel < ytoday){
            return true;
        } else if (ysel > ytoday){
            return false;
        } else if (nmsel < nmtoday && ysel <= ytoday){
            return true;
        } else if (nmsel > nmtoday && ysel >= ytoday){
            return false;
        } else if (dsel < dtoday){
            return true;
        } else {
            return false;
        }
    }

    public Integer getDayOfToday() {
        return today.getDate();
    }

    public Integer getNumberMonthOfToday() {
        return today.getMonth()+1;
    }

    public String getNameMonthOfToday(){
       return month_name[today.getMonth()];
    }

    public Integer getYearOfToday() {
        return today.getYear()+1900;
    }

    public Integer getDaySelected() {
        return day_selected;
    }

    protected void setDaySelected(Integer day_selected) {
        this.day_selected = day_selected;
    }

    public Integer getNumberMonthSelected() {
        return month_selected;
    }

    public String getNameMonthSelected(){
       return month_name[getNumberMonthSelected()];
    }

    protected void setMonthSelected(Integer month_selected) {
        this.month_selected = month_selected;
    }

    public Integer getYearSelected() {
        return year_selected;
    }

    protected void setYearSelected(Integer year_selected) {
        this.year_selected = year_selected;
    }

    @Override
    public void itemStateChanged(ItemEvent e){
       setMonthSelected(jComboBox1.getSelectedIndex()+1);
       setYearSelected((Integer)jComboBox2.getSelectedItem());
       if (getDaySelected()==null) setDaySelected(today.getDate());
       setCalendar(new Date(getYearSelected()-1900,getNumberMonthSelected()-1,1));
    }

    @Override
    public void mouseClicked(MouseEvent e){
        // Método não utilizado porém precisa ser declarado
    }

    @Override
    public void mousePressed(MouseEvent e){
        int linha, coluna;
        linha = tablecalendar.rowAtPoint(e.getPoint());
        coluna = tablecalendar.columnAtPoint(e.getPoint());
        if ("".equals(tablecalendar.getValueAt(linha,coluna))){
            JOptionPane.showMessageDialog(this,"Data inválida","Erro",JOptionPane.ERROR_MESSAGE);
            tablecalendar.clearSelection();
        } else {
            setMonthSelected(jComboBox1.getSelectedIndex()+1);
            setYearSelected((Integer)jComboBox2.getSelectedItem());
            setDaySelected((Integer)tablecalendar.getValueAt(linha, coluna));
            setDateSelected(new Date(getYearSelected()-1900,getNumberMonthSelected()-1,getDaySelected()));
            if (isPastDay()) JOptionPane.showMessageDialog(this,"Data ultrapassada","Aviso",JOptionPane.WARNING_MESSAGE);
        }
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // Método não utilizado porém precisa ser declarado
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // Método não utilizado porém precisa ser declarado
    }

    @Override
    public void mouseExited(MouseEvent e) {
       // Método não utilizado porém precisa ser declarado
    }

    @Override
    public void setEnabled(boolean enabled) {
        super.setEnabled(enabled);
        jComboBox1.setEnabled(enabled);
        jComboBox2.setEnabled(enabled);
        tablecalendar.setEnabled(enabled);
        renderer.setEnabled(enabled);
    }

Aqui é a classe Render que pinta o JTable.

[code]
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class SelectCellTable extends JLabel implements TableCellRenderer {

private Integer today;

public SelectCellTable(){
    setOpaque(true);
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
       setFont(new Font("monospaced", Font.BOLD, 14));
       setHorizontalAlignment(SelectCellTable.CENTER);
       if (!"".equals(value) && (Integer)value<getToday()){
           setBackground(Color.RED);
           setForeground(Color.WHITE);
       } else if (!"".equals(value) && (Integer)value==getToday()){
           setBackground(Color.BLUE);
           setForeground(Color.WHITE);
       } else if (isSelected){
           setBackground(Color.YELLOW);
           setForeground(Color.RED);
       } else if ("".equals(value)){
           setBackground(Color.LIGHT_GRAY);
           setForeground(Color.WHITE);
       } else {
           setBackground(table.getBackground());
           setForeground(table.getForeground());
       }
       setText(value.toString());
       return this;
}

public Integer getToday() {
    return today;
}

public void setToday(Integer today) {
    this.today = today;
}

}
[/code]>

O problema nem é esse. Em um look and feel agradável ele fica muito melhor que aqueles screenshots no site. Acontece que ele está descontinuado desde 2005. Prefira o JCalendar mesmo.

Opa. Obrigado pessoal estou utilizando o jcalendar mesmo.