⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tabledemo.java

📁 Java面向对象编程(随书配套源代码) 阐述了面向对象编程的思想
💻 JAVA
字号:
package chapter14;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.Calendar;
import java.util.Date;
/*** 日历类, 提供日历功能*/
public class TableDemo extends JPanel implements ActionListener, MouseMotionListener, MouseListener
{
	final private String TITLES[] = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
	final private int ROW_HEIGHT = 20;
	final private int ROW_WIDTH = 40;
	private JTable tbMain; // 表格
	private JLabel lblTitle; // 标题
	private JButton btnNextMonth; // 下个月份的按钮
	private JButton btnPrevMonth; // 上个月的按钮
	private JPanel pnlTop; // 顶部容器
	private int year; // 当前显示的年份
	private int month; // 当前显示的月份
	private int day; // 当前选择的日期
	private int week; // 当前选择的星期
	private int selectedX = -1;
	private int selectedY = -1;
	private int clickX = -1;
	private int clickY = -1;
	public TableDemo()
	{
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		year = cal.get(Calendar.YEAR);
		month = cal.get(Calendar.MONTH)+1;
		day = cal.get(Calendar.DAY_OF_MONTH)-1;
		week = cal.get(Calendar.DAY_OF_WEEK)-1;
		pnlTop = new JPanel(new FlowLayout(FlowLayout.CENTER));
		tbMain = new JTable(7,7);
		tbMain.setPreferredSize(new Dimension(ROW_WIDTH * 7, ROW_HEIGHT * 7));
		tbMain.setRowHeight(ROW_HEIGHT);
		for(int i=0; i<TITLES.length; i++)
			tbMain.setValueAt(TITLES[i],0,i);
		tbMain.addMouseMotionListener(this);
		tbMain.addMouseListener(this);
		tbMain.setEnabled(false);
		tbMain.setCellSelectionEnabled(true);
		lblTitle = new JLabel();
		btnNextMonth = new JButton(">|");
		btnNextMonth.addActionListener(this);
		btnPrevMonth = new JButton("|<");
		btnPrevMonth.addActionListener(this);
		pnlTop.add(btnPrevMonth);
		pnlTop.add(lblTitle);
		pnlTop.add(btnNextMonth);
		setTheTitle();
		// 布局组件
		setLayout(new BorderLayout());
		add(pnlTop, BorderLayout.NORTH);
		add(tbMain, BorderLayout.CENTER);
		showMonth(); // 设置显示当前月份
	}
	
	//取得指定年份和月份的日期数
	public int getDaysOfMonth(int year, int month)
	{
		int Days[]= {31,28,31,30,31,30,31,31,30,31,30,31};
		// 判断是否闰年
		if( year % 400 == 0 || (year % 4 ==0 && year % 100 != 0)) // 说明是闰年
			Days[1] = 29;
		return Days[month-1];
	}

	// 取得指定月份的头一天的星期几
	public int getWeekOfFirstDay(int year, int month)
	{
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.MONTH, month - 1);
		cal.set(Calendar.DAY_OF_MONTH, 1);
		int result = cal.get(Calendar.DAY_OF_WEEK) - 1;
		return result ;
	}

	// 设置显示的标题
	private void setTheTitle()
	{
		String m = String.valueOf(month);
		if(m.length() ==1) m = "0"+m;
		lblTitle.setText(String.valueOf(year)+"年"+m+"月");
	}

	// 显示月份
	private void showMonth()
	{
		for(int x=0; x<7; x++)
		for(int y=1; y<7; y++) tbMain.setValueAt("",y, x);
		int y = 1;
		int x = getWeekOfFirstDay(year, month);
		int maxDay = getDaysOfMonth(year,month);
		for(int i=0; i<maxDay; i++)
		{
			tbMain.setValueAt(new Integer(i+1),y,x);
			x ++;
			if(x>6)
			{
				x=0;
				y++;
			}
		}
		repaint();
	}

	//按钮事件处理
	public void actionPerformed(ActionEvent e)
	{
		if(e.getSource().equals(btnNextMonth))
		{
			month++;
			if(month>12)
			{
				month = 1;
				year++;
			}
		}
		if(e.getSource().equals(btnPrevMonth))
		{
			month--;
			if(month<1)
			{
				month = 12;
				year --;
			}
		}
		setTheTitle();
		showMonth();
	}
	//绘制
	public void paint(Graphics g)
	{
		super.paint(g);
		// repaint Table First LINE
		g.fillRect(0,pnlTop.getHeight(), getWidth()-1, ROW_HEIGHT -1);
		g.setColor(Color.white);
		for(int i=0; i<7; i++)
			g.drawString((String)(tbMain.getModel().getValueAt(0,i)),i*ROW_WIDTH, pnlTop.getHeight()+ ROW_HEIGHT - 3);
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.MONTH, month);
		cal.set(Calendar.DAY_OF_MONTH, day);
		int line = cal.get(Calendar.DAY_OF_WEEK_IN_MONTH) + 1;
		int x = week * tbMain.getWidth() / 7;
		int y = pnlTop.getHeight() + ROW_HEIGHT * line ;
		g.setColor(Color.black);
		g.drawRect(x+1,y+1, ROW_WIDTH-4, ROW_HEIGHT-4);
		if(selectedX>=0&&selectedY>=0&&! tbMain.getModel().getValueAt(selectedY,selectedX).equals(""))
		{
			g.setColor(Color.blue);
			g.drawRect(selectedX*ROW_WIDTH+1,(selectedY+2)*ROW_HEIGHT -1 ,ROW_WIDTH-4,ROW_HEIGHT-4);
		}
		if(clickY>=0&&clickX>=0& ! tbMain.getModel().getValueAt(clickY,clickX).equals(""))
		{
			g.setColor(Color.green);
			g.drawRect(clickX*ROW_WIDTH+1,(clickY+2)*ROW_HEIGHT -1 ,ROW_WIDTH-4,ROW_HEIGHT-4);
		}
	}
	public void mouseDragged(MouseEvent e){}
	public void mouseMoved(MouseEvent e)
	{
		if(e.getX()>0 && e.getY()<getWidth() && e.getY()> ROW_HEIGHT && e.getY()< ROW_HEIGHT * 7 )
		{
			selectedX = e.getX() / ROW_WIDTH;
			selectedY = e.getY() / ROW_HEIGHT;
			repaint();
		}
	}
	public void mouseClicked(MouseEvent e) { }
	public void mousePressed(MouseEvent e)
	{
		if(e.getX()>0 && e.getY()<getWidth() && e.getY()> ROW_HEIGHT && e.getY()< ROW_HEIGHT * 7 )
		{
			clickX = e.getX() / ROW_WIDTH;
			clickY = e.getY() / ROW_HEIGHT;
			repaint();
		}
	}
	public void mouseReleased(MouseEvent e){}
	public void mouseEntered(MouseEvent e){}
	public void mouseExited(MouseEvent e){}
/* --=[ 测试代码 ]=-- */
	public static void main(String[] args)
	{
		JFrame frm = new JFrame();
		frm.getContentPane().setLayout(new BorderLayout());
		frm.getContentPane().add(new TableDemo());
		frm.setTitle("表格演示");
		frm.pack();
		frm.setVisible(true);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -