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 ?
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.