您的位置:首页 > 编程语言 > Java开发

java实现日历选择器及使用方法

2011-05-17 17:00 666 查看
先贴代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import javax.swing.AbstractAction;
import javax.swing.InputMap;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

import cn.com.voltronic.ats.constants.Constants;

public class MyCalendarPanel extends JDialog {

/**
*
* @author Lincoln_Jia
*/
private static final long serialVersionUID = -1329364976709789113L;
private JComboBox comboBoxMonth;
private JSpinner spinnerYear;
private MyJTable table;
private MyJTableModel tableModel;
private Calendar calendar;
private String[] days = { "SUN", "MON", "TUR", "WED", "THU", "FRI", "SAT" };
private String[] months = { "January", "February", "March", "April", "May",
"June", "July", "August", "September", "October", "November",
"December" };
private int year = -1;
private int month = -1;
private int date = -1;

private boolean flag = true;
private JTextField textField;

public MyCalendarPanel(JTextField textField) {
super();
this.setModal(true);
/*try {
UIManager.setLookAndFeel(new WindowsLookAndFeel());
} catch (Exception ex) {
ex.printStackTrace();
}
SwingUtilities.updateComponentTreeUI(this);*/
this.textField = textField;
this.calendar = Calendar.getInstance();
initComponent();
this.setIconImage(Constants.CONNECTEDIMG);
this.setSize(300, 300);
}

public Calendar getCalendar() {
return calendar;
}

public String getCalendarByDate() {
DateFormat dfmt = new SimpleDateFormat("yyyy-MM-dd");
String time = dfmt.format(calendar.getTime());
return time;
}

private void initComponent() {
this.setLayout(new BorderLayout());
setNorthPanel();
setCenterPanel();
eventListenter();
setData();
}

private void setData() {
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH);
date = calendar.get(Calendar.DATE);

comboBoxMonth.setSelectedIndex(month);
spinnerYear.setValue(new Integer(year));
}

private void eventListenter() {
spinnerYear.addChangeListener(new ChangeListener() {

public void stateChanged(ChangeEvent e) {
year = Integer.parseInt(String.valueOf(spinnerYear.getValue()));
refreshTable();
}

});

comboBoxMonth.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
month = comboBoxMonth.getSelectedIndex();
refreshTable();
}

});

table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int row = table.rowAtPoint(e.getPoint());
int col = table.columnAtPoint(e.getPoint());
Object val = table.getValueAt(row, col);
if (val != null && row != 0) {
if (table.getSelectedRow() > -1
&& table.getSelectedColumn() > -1) {
date = Integer.parseInt(String.valueOf(table
.getValueAt(table.getSelectedRow(), table
.getSelectedColumn())));
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month);
calendar.set(Calendar.DATE, date);
}
textField.setText(MyCalendarPanel.this.getCalendarByDate());
textField.requestFocus();
dispose();
}
}
});

AbstractAction right = (new AbstractAction() {

private static final long serialVersionUID = -3429888240127305492L;

public void actionPerformed(ActionEvent e) {
if (table.getColumnCount() == table.getSelectedColumn() + 1) {
table.changeSelection(table.getSelectedRow() + 1, 0, false,
false);
} else {
table.changeSelection(table.getSelectedRow(), table
.getSelectedColumn() + 1, false, false);
}
}
});

AbstractAction left = (new AbstractAction() {

private static final long serialVersionUID = -2487040789339112435L;

public void actionPerformed(ActionEvent e) {
if (0 > table.getSelectedColumn() - 1) {
table.changeSelection(table.getSelectedRow() - 1, table
.getColumnCount() - 1, false, false);
} else {
table.changeSelection(table.getSelectedRow(), table
.getSelectedColumn() - 1, false, false);
}
}

});

InputMap inputMap = table
.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0);
table.getActionMap().put(inputMap.get(keyStroke), right);
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0);
table.getActionMap().put(inputMap.get(keyStroke), left);

}

private void refreshTable() {
for (int i = tableModel.getRowCount() - 1; i > 0; i--) {
tableModel.removeRow(i);
}
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month);
int maxDate = calendar.getActualMaximum(Calendar.DATE);
calendar.set(Calendar.DATE, 1);
int startDay = calendar.get(Calendar.DAY_OF_WEEK);

for (int i = 0; i < 6; i++) {
tableModel.addRow(new Object[7]);
}

int selectRow = -1;
int selectColumn = -1;

for (int i = 0; i < maxDate; i++) {
int m = (int) ((startDay - 1) / 7) + 1;
int n = (startDay - 1) % 7;
tableModel.setValueAt(String.valueOf(i + 1), m, n);
startDay = startDay + 1;
if (date != -1 && date == i + 1) {
selectRow = m;
selectColumn = n;
}
}

table.changeSelection(selectRow, selectColumn, false, false);

}

private void setCenterPanel() {
table = new MyJTable();
tableModel = new MyJTableModel();
tableModel.setColumnIdentifiers(days);
tableModel.addRow(days);
table.setModel(tableModel);
for (int i = 0; i < 7; i++) {
table.getColumnModel().getColumn(i).setCellRenderer(
new DefaultTableCellRenderer2());
}
this.add(table, BorderLayout.CENTER);
}

private void setNorthPanel() {
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
comboBoxMonth = new JComboBox();
for (int i = 0; i < months.length; i++) {
comboBoxMonth.addItem(months[i]);
}
comboBoxMonth.setSelectedIndex(-1);
panel.add(comboBoxMonth);
RolloverSpinnerListModel numberModel = new RolloverSpinnerListModel(
1980, 1980, 2099, 1);
spinnerYear = new JSpinner(numberModel);
JSpinner.NumberEditor numberEditor = new JSpinner.NumberEditor(
spinnerYear, "####");
spinnerYear.setEditor(numberEditor);
panel.add(spinnerYear);

this.add(panel, BorderLayout.NORTH);
}

public static void main(String[] args) {
// JFrame frame = new JFrame();
MyCalendarPanel calendarPanel = new MyCalendarPanel(null);
// frame.getContentPane().add(calendarPanel, BorderLayout.CENTER);
calendarPanel.setSize(300, 300);
// calendarPanel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
calendarPanel.setLocationRelativeTo(null);
calendarPanel.setVisible(true);
}

protected void validateTree() {
super.validateTree();
if (flag) {
table.requestFocus();
flag = false;
}
}

class DateBean implements Serializable{

private static final long serialVersionUID = 3010787830585461136L;
private String dt;
private String view;

public DateBean(String dt, String view) {
this.dt = dt;
this.view = view;
}

public String getDt() {
return dt;
}

public void setDt(String dt) {
this.dt = dt;
}

public String getView() {
return view;
}

public void setView(String view) {
this.view = view;
}

@Override
public String toString() {
return view;
}

}

class RolloverSpinnerListModel extends SpinnerNumberModel {
private static final long serialVersionUID = 7366455425120197392L;

public RolloverSpinnerListModel(int value, int minimum, int maximum,
int stepSize) {
super(value, minimum, maximum, stepSize);
}

public Object getNextValue() {
Object returnValue = super.getNextValue();
if (returnValue == null) {
returnValue = super.getMinimum();
}
return returnValue;
}

public Object getPreviousValue() {
Object returnValue = super.getPreviousValue();
if (returnValue == null) {
returnValue = super.getMaximum();
}
return returnValue;
}
}

class MyJTable extends JTable {
private static final long serialVersionUID = 2092799354481792367L;

public MyJTable() {
this.getTableHeader().setReorderingAllowed(false);
this.getTableHeader().setResizingAllowed(false);
this.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.setCellSelectionEnabled(true);
this.setGridColor(Color.white);
}

public void changeSelection(int rowIndex, int columnIndex,
boolean toggle, boolean extend) {
if (this.getValueAt(rowIndex, columnIndex) == null) {
return;
}

if (rowIndex == 0) {
return;
}

super.changeSelection(rowIndex, columnIndex, toggle, extend);
}

public void repaint(int x, int y, int width, int height) {
super.repaint(x, y, width, height);

if (height > 0) {
makeTableRowHeight();
}
}

protected void validateTree() {
super.validateTree();

makeTableRowHeight();
}

private void makeTableRowHeight() {
int rowHeight = (int) ((this.getHeight() / 7) * 0.6);

if (rowHeight > 0) {
this.setRowHeight(0, rowHeight);
}

rowHeight = (int) ((this.getHeight() - rowHeight) / 6);

if (rowHeight > 0) {
for (int i = 1; i < 8; i++) {
this.setRowHeight(i, rowHeight);
}
}
}

}

class MyJTableModel extends DefaultTableModel {
private static final long serialVersionUID = 3655520869200784738L;

public boolean isCellEditable(int row, int column) {
return false;
}
}

class DefaultTableCellRenderer2 extends DefaultTableCellRenderer {
private static final long serialVersionUID = -8779549993366848535L;

public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
Component component = super.getTableCellRendererComponent(table,
value, isSelected, hasFocus, row, column);
this.setHorizontalAlignment(SwingConstants.CENTER);

if (row == 0) {
component.setBackground(UIManager
.getColor("Table.focusCellForeground"));
component.setForeground(UIManager
.getColor("Table.focusCellBackground"));
return component;
} else {
if (isSelected) {
component.setBackground(UIManager
.getColor("Table.focusCellForeground"));
component.setForeground(UIManager
.getColor("Table.focusCellBackground"));
} else {
component.setBackground(UIManager
.getColor("Table.focusCellBackground"));
component.setForeground(UIManager
.getColor("Table.focusCellForeground"));
}

if (column == 0 || column == 6) {
component.setForeground(Color.red);
}
}

return component;
}
}
}


使用方法是:

MyCalendarPanel calendarPanel = new MyCalendarPanel(jTextField1);
calendarPanel.setBounds(getX() + jLabel3.getX() + 30, getY()
+ jLabel3.getY() + 10, calendarPanel.getWidth(),
calendarPanel.getHeight());//设置显示位置和大小
calendarPanel.setVisible(true);


运行效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐