import java.applet.applet; import java.awt.*; import java.util.*;
public class calendarapplet extends applet{
static final = 70; //顶端距离 static final int cellwidth=50,cellheight = 30; //单元格尺寸 static final int margin = 3; //边界距离 static final int february = 1; textfield tfyear = new textfield("2004", 5); //显示年份的文本域 choice monthchoice = new choice(); //月份选择下拉框 button btupdate = new button("更新"); //更新按钮 gregoriancalendar calendar=new gregoriancalendar(); //日历对象 font smallfont = new font("timesroman", font.plain, 15); //显示小字体 font bigfont = new font("timesroman", font.bold, 50); //显示大字体 string days[] = {"星期日", "星期一", "星期二", "星期三","星期四", "星期五", "星期六"}; string months[] = {"一月", "二月", "三月", "四月","五月", "六月", "七月", "八月", "九月","十月", "十一月", "十二月"}; int daysinmonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //每个月的天数 int searchmonth,searchyear; //查询的年份及月份
public void init(){ setbackground(color.white); //设置背景颜色 searchmonth = calendar.get(calendar.month); //得到系统年份 searchyear = calendar.get(calendar.year);//得到系统月份 add(new label(" 年:")); //增加组件到applet tfyear.settext(string.valueof(searchyear)); //设置文本域文字 add(tfyear); add(new label(" 月:")); monthchoice.setfont(smallfont); //设置月份选择下拉框的显示字体 for (int i = 0; i < 12; i++) { monthchoice.additem(months[i]); //增加下拉框选项 } monthchoice.select(searchmonth); //设置下拉框当前选择项 add(monthchoice); add(btupdate); ponentcount=ponentcount(); //得到applet中的组件数量 for (int i=0;i&ponentcount;i++){ ponent(i).setfont(smallfont); //设置所有组件的显示字体 } } public void paint(graphics g){ fontmetrics fontmetric; //显示字体的fontmetrics对象 int fontascent; int daypos; int totalwidth, totalheight; //总的宽度,高度 int numrows; //行数 int xnum, ynum; //水平和垂直方向单元格数量 int numdays; string daystr; //显示天数字符串 int margin; g.setcolor(color.lightgray); //设置当前颜色 g.setfont(bigfont); //设置当前使用字体 g.drawstring(searchyear+"年",+70); //绘制字符串 g.drawstring((searchmonth+1)+"月",+130); g.setcolor(color.black); g.setfont(smallfont); fontmetric = g.getfontmetrics(); //获取变量初值 fontascent = fontmetric.getascent(); daypos = + fontascent / 2; totalwidth = 7 * cellwidth; //得到总的表格宽度 for (int i = 0; i < 7; i++) { g.drawstring(days[i], (cellwidth-fontmetric.stringwidth(days[i]))/2 + i*cellwidth,daypos-20); //绘制表格标题栏 } numrows = getnumberrows(searchyear, searchmonth); //计算需要的行的数量 totalheight = numrows * cellheight; //得到总的表格高度 for (int i = 0; i <= totalwidth; i += cellwidth) { g.drawline(i, , i,+ totalheight); //绘制表格线 } for (int i = 0, j = ; i <= numrows; i++, j += cellheight) { g.drawline(0, j, totalwidth, j); //绘制表格线 } xnum = (getfirstdayofmonth(searchyear, searchmonth) + 1) * cellwidth - margin; ynum = + margin + fontascent; numdays = daysinmonth[searchmonth] + ((calendar.isleapyear(searchyear) && (searchmonth == february)) ? 1 : 0); for (int day = 1; day <= numdays; day++) { daystr = integer.tostring(day); g.drawstring(daystr, xnum - fontmetric.stringwidth(daystr), ynum); //绘制字符串 xnum += cellwidth; if (xnum > totalwidth) { xnum = cellwidth - margin; ynum += cellheight; } } } public boolean action(event e, object o){ int searchyearint; if (e.target==btupdate){ searchmonth = monthchoice.getselectedindex(); //得到查询月份 searchyearint = integer.parseint(tfyear.gettext(), 10); //得到查询年份 if (searchyearint > 1581) { searchyear = searchyearint; } repaint(); //重绘屏幕 return true; } return false; } private int getnumberrows(int year, int month) { //得到行数量 int firstday; int numcells; if (year < 1582) { //年份小于1582年,则返回-1 return (-1); } if ((month < 0) || (month > 11)) { return (-1); } firstday = getfirstdayofmonth(year, month); //计算月份的第一天 if ((month == february) && (firstday == 0) && !calendar.isleapyear(year)) { return 4; } numcells = firstday + daysinmonth[month]; if ((month == february) && (calendar.isleapyear(year))) { numcells++; } return ((numcells <= 35) ? 5 : 6); //返回行数 } private int getfirstdayofmonth(int year, int month) { //得到每月的第一天 int firstday; int i; if (year < 1582) { //年份小于1582年,返回-1 return (-1); } if ((month < 0) || (month > 11)) { //月份数错误,返回-1 return (-1); } firstday = getfirstdayofyear(year);//得到每年的第一天 for (i = 0; i < month; i++) { firstday += daysinmonth[i]; //计算每月的第一天 } if ((month > february) && calendar.isleapyear(year)) { firstday++; } return (firstday % 7); }
private int getfirstdayofyear(int year){ //计算每年的第一天 int leapyears; int hundreds; int fourhundreds; int first; if (year < 1582) { //如果年份小于1582年 return (-1); //返回-1 } leapyears = (year - 1581) / 4; hundreds = (year - 1501) / 100; leapyears -= hundreds; fourhundreds = (year - 1201) / 400; leapyears += fourhundreds; first=5 + (year - 1582) + leapyears % 7; //得到每年第一天 return first; } }
运行结果忍受:
先上张效果图:
以下是实现代码:
/*日历*/ import java.awt.*; import java.awt.event.*; import java.util.*; import java.util.regex.Pattern; import javax.swing.*; public class Demo28 extends JFrame { int m = 1; String[] monthchoose = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12" }; // 存放月份的字符数组 String[] columnNames = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }; // 存放星期的字符数组 Calendar ca = Calendar.getInstance(); Container contentPane = getContentPane(); Vector<String> vector = new Vector<String>(); String[][] date = new String[6][7]; // 表格的显示数据的格式 TextField tf; // 文本框的值代表的是年份 JComboBox jb; JTable table; // 把日期用table的方式显示出来 public void getDate(String year, String month, String week, int Max_Day) { int n = 0, b = 0; // 动态把传进来月份的天数存放到容器里 for (int j = 1; j <= Max_Day; j++) { vector.add(String.valueOf(j)); } //每次往table里添加数据的时候,都预先把原table里 的 数据清空 for(int x = 0;x<date.length;x++){ for(int y = 0;y<date[x].length;y++){ date[x][y] = null; } } // 根据传进来月份的第一天是星期几,来构建Table for (int a = Integer.parseInt(week) - 1; a < date[0].length; a++) { date[0][a] = new String((String) vector.toArray()[n]); n++; } for (int i = 1; i < date.length; i++) { for (int j = 0; j < date[i].length; j++) { if (n < vector.size()) { date[i][j] = new String((String) vector.toArray()[n]); n++; } else break; } } // 把容器里的数据全部清除,以备下次再存放新的数据 while (b < vector.size()) { vector.remove(b); } } public void chooseDate(String day) { JLabel label = new JLabel(); for (int y = 0; y < date.length; y++) { for (int z = 0; z < date[y].length; z++) { System.out.print(date[y][z] + " "); System.out.println(day); if (date[y][z] != null) { if (date[y][z].equals(day)) { table.setSelectionBackground(Color.yellow); return; } } } } } public void paint() { setTitle("日历"); setBounds(200, 200, 350, 178); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); int m = 0; String year = String.valueOf(ca.get(Calendar.YEAR)); // 得到当前的系统时间的年份,并把这个数值存放到year这个变量里 String month = String.valueOf(ca.get(Calendar.MONTH) + 1); // 得到当前的系统时间的月份,并把这个数值存放到month这个变量里 String day = String.valueOf(ca.get(Calendar.DATE)); // 得到当前的系统时间的日期,并把这个数值存放到day这个变量里 ca.set(Calendar.DATE, 1); // 把Calendar 对象的DATA设置为1 String week = String.valueOf(ca.get(Calendar.DAY_OF_WEEK)); // 根据设置的Calendar对象,计算出这个月第一天是星期几 int Max_Day = ca.getActualMaximum(Calendar.DATE); // 得到当前系统时间月份有多少天 getDate(year, month, week, Max_Day); // 从月份数组里取出与当前系统时间一样的月份值 for (int i = 0; i < monthchoose.length; i++) { if (monthchoose[i].equals(month)) { m = i; } } JToolBar toolBar = new JToolBar(); JButton b1 = new JButton("<"); b1.addMouseListener(new myMouseListener1()); JButton b2 = new JButton(">"); b2.addMouseListener(new myMouseListener2()); JLabel j1 = new JLabel("年"); JLabel j2 = new JLabel("月"); tf = new TextField(5); tf.addKeyListener(new myKeyListener()); tf.setText(year); jb = new JComboBox(monthchoose); jb.setSelectedIndex(m); jb.addActionListener(new myActionListener3()); table = new JTable(date, columnNames); //table.addMouseListener(new tableMouseListener()); table.setPreferredScrollableViewportSize(new Dimension(350, 150)); JScrollPane jsp = new JScrollPane(table); contentPane.add(jsp, BorderLayout.CENTER); chooseDate(day); toolBar.add(b1); toolBar.add(tf); toolBar.add(b2); toolBar.add(j1); toolBar.add(jb); toolBar.add(j2); toolBar.setLocation(0, 0); toolBar.setSize(400, 15); contentPane.add(toolBar, BorderLayout.NORTH); setVisible(true); new Thread(new PaintThread()).start(); // 调用内部类PaintThread,根据里面的设置来重画 } public static void main(String[] args) { Demo28 d28 = new Demo28(); d28.paint(); } // 鼠标单击左边按钮触发的事件 class myMouseListener1 extends MouseAdapter { public void mouseClicked(MouseEvent e) { String str = tf.getText().trim(); // 得到文本框的值 int i = Integer.parseInt(str); i = i - 1; tf.setText(String.valueOf(i)); String new_year = String.valueOf(i); // 把表示年份的文本框的值存放到变量new_year里 ca.set(Calendar.YEAR, i); // 把Calendar 对象的YEAR设置为用户设置的年份 String new_month = (String) jb.getSelectedItem(); // 得到月份值 ca.set(Calendar.MONTH, Integer.parseInt(new_month) - 1); // 把Calendar对象的MONTH设置为用户设置的月份 ca.set(Calendar.DATE, 1); // 把Calendar 对象的DATA设置为1 String new_week = String.valueOf(ca.get(Calendar.DAY_OF_WEEK)); // 根据设置的Calendar对象,计算出这个月第一天是星期几 int Max_Day = ca.getActualMaximum(Calendar.DATE); // 根据设置后的Calendar对象计算这个月份有多少天 getDate(new_year, new_month, new_week, Max_Day); } } class myKeyListener extends KeyAdapter { public void keyReleased(KeyEvent e) { try { int i = Integer.parseInt(tf.getText().trim()); int key = e.getKeyCode(); if (key == KeyEvent.VK_ENTER) { String new_year = String.valueOf(i); ca.set(Calendar.YEAR, i); // 把Calendar对象的YEAR设置为用户设置的年份 String new_month = (String) jb.getSelectedItem(); // 得到月份值 ca.set(Calendar.MONTH, Integer.parseInt(new_month) - 1); // 把Calendar对象的MONTH设置为用户设置的月份 ca.set(Calendar.DATE, 1); // 把Calendar 对象的DATA设置为1 String new_week = String.valueOf(ca .get(Calendar.DAY_OF_WEEK)); // 根据设置的Calendar对象,计算出这个月第一天是星期几 int Max_Day = ca.getActualMaximum(Calendar.DATE); // 根据设置后的Calendar对象计算这个月份有多少天 getDate(new_year, new_month, new_week, Max_Day); } } catch (NumberFormatException excption) { System.out.println("你输入的年份不正确!"); } } } // 鼠标单击右边按钮触发的事件 class myMouseListener2 extends MouseAdapter { public void mouseClicked(MouseEvent e) { String str = tf.getText().trim(); int i = Integer.parseInt(str); i = i + 1; tf.setText(String.valueOf(i)); String new_year = String.valueOf(i); // 把表示年份的文本框的值存放到变量new_year里 ca.set(Calendar.YEAR, i); // 把Calendar 对象的YEAR设置为用户设置的年份 String new_month = (String) jb.getSelectedItem(); // 得到月份值 ca.set(Calendar.MONTH, Integer.parseInt(new_month) - 1); // 把Calendar对象的MONTH设置为用户设置的月份 ca.set(Calendar.DATE, 1); // 把Calendar 对象的DATA设置为1 String new_week = String.valueOf(ca.get(Calendar.DAY_OF_WEEK)); // 根据设置的Calendar对象,计算出这个月第一天是星期几 int Max_Day = ca.getActualMaximum(Calendar.DATE); // 根据设置后的Calendar对象计算这个月份有多少天 getDate(new_year, new_month, new_week, Max_Day); } } // 鼠标单击选择框触发的事件 class myActionListener3 implements ActionListener { public void actionPerformed(ActionEvent e) { String new_year = String.valueOf(ca.get(Calendar.YEAR)); // 把表示年份的文本框的值存放到变量new_year里 String new_month = (String) jb.getSelectedItem(); // 得到用户设置的月份 ca.set(Calendar.MONTH, Integer.parseInt(new_month) - 1); // 把Calendar对象的月份值设置为用户定义的月份 ca.set(Calendar.DATE, 1); // 把Calendar 对象的DATA设置为1 String new_week = String.valueOf(ca.get(Calendar.DAY_OF_WEEK)); // 根据设置的Calendar对象,计算出这个月第一天是星期几 int Max_Day = ca.getActualMaximum(Calendar.DATE); // 根据设置后的Calendar对象计算这个月份有多少天 getDate(new_year, new_month, new_week, Max_Day); } } // 重画组件 private class PaintThread implements Runnable { public void run() { while (true) { repaint(); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
Nocser刚刚在WHT发布了几款促销服务器,Intel Xeon X3430,8GB内存,1TB HDD,30M不限流量,月付$60.00。Nocser是一家注册于马来西亚的主机商,主要经营虚拟主机、VPS和马来西亚独立服务器业务,数据中心位于马来西亚AIMS机房,线路方面,AIMS到国内电信一般,绕日本NTT;联通和移动比较友好,联通走新加坡,移动走香港,延迟都在100左右。促销马来西亚服务器...
特网云为您提供高速、稳定、安全、弹性的云计算服务计算、存储、监控、安全,完善的云产品满足您的一切所需,深耕云计算领域10余年;我们拥有前沿的核心技术,始终致力于为政府机构、企业组织和个人开发者提供稳定、安全、可靠、高性价比的云计算产品与服务。公司名:珠海市特网科技有限公司官方网站:https://www.56dr.com特网云为您提供高速、稳定、安全、弹性的云计算服务 计算、存储、监控、安全,完善...
Webhosting24是一家始于2001年的意大利商家,提供的产品包括虚拟主机、VPS、独立服务器等,可选数机房包括美国洛杉矶、迈阿密、纽约、德国慕尼黑、日本、新加坡、澳大利亚悉尼等。商家VPS主机采用AMD Ryzen 9 5950X CPU,NVMe磁盘,基于KVM架构,德国机房不限制流量,网站采用欧元计费,最低年付15欧元起。这里以美国机房为例,分享几款套餐配置信息。CPU:1core内存...