?? calwin.java
字號:
/****************************************************************************************
* Java日歷程序
* 作者:張亞航
*
* 完成時間:2008-5-22
*
* 程序功能:
* 使用Swing組件編寫界面,能夠正確顯示月歷,并且擁有四個按鈕分別進行顯示控制
*
* 設計思路:
* 本程序總體使用MVC設計模式,其中viewer包中的CalWin程序是主界面顯示程序,
* 主要用于界面的生成和數據的刷新;
*
* Model包中的MyDate類是程序日歷的載體,本程序沒有使用JDK的類庫java.util.Date和
* java.util.Calendar類,而是重新構造了MyDate類,該類只能保存精度到日的時間
*
* Control包中的ComputeDate類主要是用來計算每個月的第一天是星期幾以及每個月的總天數
*
* Viewer類中包含了一個內部類Cell,Cell是界面日期表格中顯示中的基本元素,繼承與JLabel
* ,每個Cell對應一個MyDate對象。
*
* 程序主要流程是根據當前baseDate利用ComputeDate計算當前月份的數據,然后將所有數據
* 通過setCell方法同Cell[]數組關聯起來,初始化所有Cell,然后將數據在界面顯示。
* 每次日期發生改變,都要調用一次setCell方法,將所有界面數據刷新。
*
******************************************************************************************/
package viewer;
import control.*;
import model.MyDate;
import javax.swing.*;
import javax.swing.plaf.basic.BasicArrowButton;
import java.awt.*;
import java.awt.event.*;
public class CalWin extends JFrame implements ActionListener{
/**
*
*/
private static final long serialVersionUID = 1L;
/*******************所有界面元素******************************/
private JPanel jContentPane = null;
private JPanel controlPanel = null;
private JPanel showPanel = null;
private JPanel buttonPanel = null;
private JButton OkButton = null;
private JButton cancelButton = null;
private JTextField dateTextField = null;
private JTextField yearTextField = null;
private JTextField monthTextField = null;
private JLabel jLabel1 = null;
private JLabel jLabel2 = null;
private BasicArrowButton addButton = null;//上箭頭增加按鈕
private BasicArrowButton delButton = null;//下箭頭遞減按鈕
private BasicArrowButton delMonthButton = null;//左箭頭增加月份按鈕
private BasicArrowButton addMonthButton = null;//右箭頭減少月份按鈕
private JPanel tablePanel = null;//添加日期版面
private JPanel headerPanel = null;//存放星期的頭版
//private ButtonGroup group = null;
//private SetCell setCell = null;
/*******************所有邏輯計算相關元素******************************/
private JLabel[] headerCell = null;
private Cell[] cell = null;
private MyDate baseDate = null; //關鍵變量,記錄當前日期,很多計算都基于這個變量!!!
private ComputeDate computeDate = null;
private MyDate cellDate1 = null; //對每個cell元素進行設置的時候所要設置對應的日期
private int changeFlag = 1; //標記遞增或遞減哪個元素,1的時候修改日,2的時候修改月,三的時候修改年
/**
* 主函數
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
CalWin calendar = new CalWin();
calendar.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
calendar.setVisible(true);
}
public CalWin() {
super();
baseDate = new MyDate();
this.setSize(400, 300);
this.setTitle("JCalendar 1.2");
this.setResizable(false);
this.initialize();
}
/**初始化界面函數
* 在這里注意:由于要求上的界面很難實現所有組件
* 按照圖中所示對其,因此本界面沒有采用任何布局管理器
* 而是通過對每個組件設置邊界位置的方式進行布局管理
* */
private void initialize() {
System.out.println(baseDate);
jContentPane = new JPanel();
dateTextField = new JTextField();
dateTextField.setBounds(new Rectangle(10, 10, 20, 30));
dateTextField.setText((new Integer(baseDate.getDate()).toString()));
dateTextField.setBorder(null);
dateTextField.setEditable(false);
dateTextField.addActionListener(this);
dateTextField.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
changeFlag = 1;
System.out.print("aaaaaaaaaa"+changeFlag);
}
});
jLabel1 = new JLabel();
jLabel1.setText("-");
jLabel1.setBounds(new Rectangle(30, 10, 10, 30));
monthTextField = new JTextField();
monthTextField.setBounds(new Rectangle(45, 10, 20, 30));
monthTextField.setText((new Integer(baseDate.getMonth()).toString()));
monthTextField.setBorder(null);
monthTextField.setEditable(false);
//monthTextField.addActionListener(this);
monthTextField.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
changeFlag = 2;
System.out.print("aaaaaaaaaa"+changeFlag);
}
});
jLabel2 = new JLabel();
jLabel2.setBounds(new Rectangle(65, 10, 10, 30));
jLabel2.setText("-");
yearTextField = new JTextField();
yearTextField.setBounds(new Rectangle(80, 10, 30, 30));
yearTextField.setText((new Integer(baseDate.getYear()).toString()));
yearTextField.setBorder(null);
yearTextField.setEditable(false);
yearTextField.addActionListener(this);
yearTextField.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
changeFlag = 3;
System.out.print("aaaaaaaaaa"+changeFlag);
}
});
addButton = new BasicArrowButton(SwingConstants.NORTH);
addButton.setBounds(new Rectangle(300, 10, 50, 15));
addButton.addActionListener(this);
addButton.setBorder(null);
delButton = new BasicArrowButton(SwingConstants.SOUTH);
delButton.setBounds(new Rectangle(300, 25, 50, 15));
delButton.addActionListener(this);
controlPanel = new JPanel();
controlPanel.setLayout(null);
controlPanel.setBounds(new Rectangle(20, 5, 360, 45));
controlPanel.add(dateTextField);
controlPanel.add(jLabel1);
controlPanel.add(monthTextField);
controlPanel.add(jLabel2);
controlPanel.add(yearTextField);
controlPanel.add(addButton);
controlPanel.add(delButton);
controlPanel.setBorder(BorderFactory.createLineBorder(Color.gray));
jContentPane.setLayout(null);
jContentPane.add(controlPanel);
showPanel = new JPanel();
delMonthButton = new BasicArrowButton(SwingConstants.WEST);
delMonthButton.setBounds(new Rectangle(10, 10, 50, 20));
delMonthButton.setBorder(null);
addMonthButton = new BasicArrowButton(SwingConstants.EAST);
addMonthButton.setBounds(new Rectangle(300, 10, 50, 20));
addMonthButton.setBorder(null);
addMonthButton.setBackground(showPanel.getBackground());
addMonthButton.setOpaque(true);
addMonthButton.addActionListener(this);
delMonthButton.addActionListener(this);
headerPanel = new JPanel();
headerPanel.setLayout(new GridLayout(1,7));
headerPanel.setBounds(new Rectangle(70, 10, 220, 20));
headerCell = new JLabel[7];
//在日期頭上加入星期的標志
for(int i=0;i<7;i++)
{
String weekFlag = "";
headerCell[i] = new JLabel();
switch (i)
{
case 0:weekFlag = "Mon";break;
case 1:weekFlag = "Tue";break;
case 2:weekFlag = "Wed";break;
case 3:weekFlag = "Thu";break;
case 4:weekFlag = "Fri";break;
case 5:weekFlag = "Sat";break;
case 6:weekFlag = "Sun";break;
}
headerCell[i].setText(weekFlag);
headerPanel.add(headerCell[i]);
}
headerPanel.setBackground(Color.blue);
tablePanel = new JPanel();
tablePanel.setLayout(new GridLayout(6,7));
tablePanel.setBounds(new Rectangle(70, 35, 220, 110));
cell = new Cell[42];
//setCell = new SetCell();
//初始化cell[42]數組里面的cell對象
baseDate = new MyDate();
for(int i=0;i<42;i++)
{
cell[i] = new Cell();
//group.add(cell[i]);
}
// 為cell[42]數組里面的cell對象置入初值
cell = SetCell(cell, baseDate);
//group.add(cell[i]);
for(int i=0;i<42;i++)
{
tablePanel.add(cell[i]);
}
showPanel.setLayout(null);
showPanel.setBounds(new Rectangle(20, 60, 360, 160));
showPanel.add(delMonthButton);
showPanel.add(addMonthButton);
showPanel.add(tablePanel);
showPanel.add(headerPanel);
jContentPane.add(showPanel);
showPanel.setBorder(BorderFactory.createLineBorder(Color.gray));
OkButton = new JButton();
OkButton.setBounds(new Rectangle(185, 5, 80, 20));
OkButton.setText("Ok");
OkButton.addActionListener(this);
cancelButton = new JButton();
cancelButton.setBounds(new Rectangle(270, 5, 80, 20));
cancelButton.setText("Cancel");
cancelButton.addActionListener(this);
buttonPanel = new JPanel();
buttonPanel.setLayout(null);
buttonPanel.setBounds(new Rectangle(20, 230, 360, 30));
buttonPanel.add(OkButton);
buttonPanel.add(cancelButton);
buttonPanel.setBorder(BorderFactory.createLineBorder(Color.gray));
jContentPane.add(buttonPanel);
this.setContentPane(jContentPane);
}
/*********************添加事件監聽*************************/
public void actionPerformed(ActionEvent e)
{
//添加月份按鈕
if (e.getSource() == addMonthButton) {
if(baseDate.getMonth()<12)
{
this.baseDate.setMonth(baseDate.getMonth()+1);
}
// 對于每年12月份的時候,這里做特殊處理:將年份加一,月份設置為1
else
{
this.baseDate.setYear(baseDate.getYear()+1);
this.baseDate.setMonth(1);
}
this.SetCell(cell, baseDate); //如果點擊確定按鈕就調用setDay()重新方法繪制按鈕
updateView();
}
// 減少月份按鈕
else if (e.getSource() == delMonthButton) {
if(baseDate.getMonth()>1)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -