背记不如实战系列-javaGUI实例-日历制作

简介: 背记不如实战系列-javaGUI实例-日历制作

在这里插入图片描述


👨‍💻个人主页@元宇宙-秩沅

**hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!**

本文由 秩沅 原创

收录于专栏 玩归玩闹归闹,别拿java开玩笑


⭐相关文章: ⭐

翻阅必备,一看必知——Java -GUI界面设计

GUI实例-之蓝色妖姬

记不如实战系列-javaGUI实例-计算器制作


@[TOC]


一,效果图


👨‍💻


!\[在这里插入图片描述\](https://ucc.alicdn.com/images/user-upload-01/4f18d1fee63f4729a4739ad5a151ea56.png

二,完整代码

👨‍💻👍

package Win2;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
@SuppressWarnings("unused")
public class Rili {
   
   
        public static void main(String[] args) {
   
   

             window w1 = new window("日历",450,100,600,600); //有参构造,设置位置大小

        }

    }
//window类
package Win2;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

@SuppressWarnings("serial")
class window extends JFrame implements MouseListener{
   
   

    int month = 1  ; //显示月份
    int []T ;        //存储日期的数组
    JButton b1 , b2 ; 
    JLabel l1 ,l2 ;
    JPanel panel ,panel1 , panel2 ;
    JTextArea t ;
    JLabel [ ]q ; 
    int k ;
       public window(String A , int a , int  b ,int c ,int d )
       {
   
       

           q = new JLabel [43] ;

           setBu();
           setTitle(A);
           setBounds(a ,b ,c ,d );
           setVisible(true);
           validate();            //确保组件具有有效的布局
           setDefaultCloseOperation(DISPOSE_ON_CLOSE);
       }

       @SuppressWarnings("null")
    void setBu()
       {
   
   
//存放日期于数组中
             T = new int [367] ;
             int day  = 0 ; 
             int start = 5 ; //2022年是从星期六开始
             for(int i = 1 ; i <= 12 ; i++ )
             {
   
   
               //设置月份的天数
                 if (i == 1 || i  == 3 || i  == 5 || i == 7 || i == 8  || i == 10 || i == 12) 
                     day = 31 ;

                 else if (i == 4 || i == 6 || i == 9 || i == 11) 
                    day = 30;

                 else if (i == 2) {
   
     day = 28; }

                 for( int j = 1 ; j <= day ; j++)  
                 {
   
   
                    if(start<T.length )
                     T[start++] = j;         
                 }
             }


//创建主面板        
           panel = new JPanel() ;         
           setLayout(new BorderLayout());                    //主布局为边界布局

//创建按钮和标签组件
           b1 = new JButton("上月");
           b2 = new JButton("下月");

           l1 = new JLabel("2022年         ");
           l2 = new JLabel("         "+month+"月");

//在面板容器中添加标签和按钮组件     
           panel.add(l1);
           panel.add(b1);
           panel.add(b2);
           panel.add(l2);
           add(panel,BorderLayout.NORTH);
//给按钮添加监听事件
           b1.addMouseListener(this);
           b2.addMouseListener(this);
// 在中间再添加Panel面板
           JButton b3 , b4 , b5 , b6 , b7 , b8 , b9 ;

           b3 = new JButton("一");
           b4 = new JButton("二");
           b5 = new JButton("三");
           b6 = new JButton("四");
           b7 = new JButton("五");
           b8 = new JButton("六");
           b9 = new JButton("日");
           panel1  = new JPanel() ; 
           panel1.setLayout(new BorderLayout());
//面板panel1的北方 中 添加面板o    (存放星期)   
           JPanel o ; 
           o  = new JPanel() ; 
           o.setLayout(new GridLayout(1,7));
           o.add(b3);
           o.add(b4);
           o.add(b5);
           o.add(b6);
           o.add(b7);
           o.add(b8);
           o.add(b9);
           panel1.add(o,BorderLayout.NORTH);

//面板panel1的中心添加日期(布局为网格布局)    
         panel2  = new JPanel() ;     
         panel2.setLayout(new GridLayout(6,7));
         panel1.add(panel2);
          k = month*42-42;
          for( int  i = 1 ; i < 43 ; i++ )
             {
   
   
                 q[ i ] = new JLabel("           "+T[k++]+"        ") ;         
                 panel2.add( q[i] ) ;

             }
         add(panel1,BorderLayout.CENTER);
       }

     @Override

public void mouseClicked(MouseEvent e) {
   
       
        //按左键时,月份减少,日期更新
        if(e.getSource() == b1 && e.getButton() == MouseEvent.BUTTON1 && month != 1)
        {
   
   
            month -- ;
            l2 .setText("         "+month+"月");
            k = month*42-42;
            for( int  i = 1 ; i < 43 ; i++ )        
            q[ i ].setText("           "+T[k++]+"        ") ;         

        }
        //按有右键时,月份增加,日期更新

if(e.getSource() == b2 && e.getButton() == MouseEvent.BUTTON1 && month != 12)
        {
   
   
            month ++ ;
            l2 .setText("         "+month+"月");
             k = month*42-42;
             for( int  i = 1 ; i < 43 ; i++ )        
             q[ i ].setText("           "+T[k++]+"        ") ;    
        }
    }
    @Override
    public void mousePressed(MouseEvent e) {
   
    }
    @Override
    public void mouseReleased(MouseEvent e) {
   
      }
    @Override
    public void mouseEntered(MouseEvent e) {
   
     }
    @Override
    public void mouseExited(MouseEvent e) {
   
      }
}

三,翻阅必备


👨‍💻组件


(1)JTextField --文本框

 输入单行文本

(2)JTextArea--文本区

输入多行文本

(3)JButton--按钮

单击按钮

(4)JLable--标签

提供提示信息

(5)JChexkBox--复选框

提供多项选择

(6)JCombobox---下拉列表

下拉列表

(7)JPasswordField --密码框

输入密码

👨‍💻容器


(0)JFrame--底层容器

英文记忆 :Frame 框架

 Frame是窗口,窗口也是容器,下面的容器都称为为中间容器 

(1)JPanel--面板容器

英文记忆 :Panel 面板

默认布局为FlowLayout布局

(2)JTabbedPane --选项卡窗格容器

英文记忆 :Tabbel 选择

可作为中间容器,添加组件后课自动指定选项卡
1. 静态方法: add(  strng a  , Component c ) -----添加组件
2. 构造方法:public JTabbedPane( int  tabPlacement )   ---  tabPlacement 决定选项卡的位置

(3)JScrollPane---滚动窗格容器

英文记忆 :Scroll 滚动

只可以添加一个组件,通过滚动条来观看该组件
    一般将JTextArea 文本区 放到滚动窗格中
    JScrollPane scroll = new JScrollPane ( new  JtextArea ( ) );

(4)JSplitPane---拆分窗格容器

英文记忆 :Split 分离

被分成两部分的容器: 水平拆分窗格 ,垂直拆分窗格
1.静态常量:
水平拆分 :HORIZONTAL_SPLIT
垂直拆分:VERTICAL_SPLIT
2. 构造方法:
JSplitPane( int a , Component b ,  Component c )
JSplitPane( int a ,boolean d , Component b ,  Component c )
3,解释
参数a 填上面的两个静态常量来决定水平或垂直拆分
参数d决定拆分线移动时组件是否发生连续变化

(5)JLayeredPane----分层窗格

英文记忆 :Layered 分层

 可将需要处理重叠问题的组件添加到分层窗格中,分窗格分为五层
 1.静态方法:  add( JComponent com , int layer )
 2.解释 :     参数layer 填:
 DEFAULT_LAYER   第一层
 PALETTE_LAYER   第二层
 MODAL_LAYER     第三层
 POPUP_LAYER     第四层
 DRAG_LAYER      第五层

👨‍💻布局


(1)FlowLayout布局

英文记忆 :flow 跟随,顺从

是JPanel(面板)的默认布局 ,特点:对象居中对齐,先后顺序,从左到右排列

使用FlowLAyout的容器 , 要改变组件大小的方法,如容器中的按钮组件:

button.setPreferredSize(   new Dimension (  长  , 宽  )   )

(2)BorderLayout布局

英文记忆 :Border 边界

将区域划分 东 西 南 北 中 五个区域

如使用BorderLayout布局的容器con ,添加组件b 到北方区域
方法 :       con.add(  b , BorderLayout .  NORTH ) ;
静态常量:
EAST
WEST
SOUTH
NORTH
CENTER

(3)CardLayout布局

英文记忆 :card 卡片

叠扑克牌布局 , 点击组件,同一时刻只能 显示一个
  如:布局设置在容器con设置方法
(1)CardLayout card = new  CardLayout();
(2)con .setLayout(    card  ) ; //设置布局
(3)con.add( String a  , Component b ) ;  //添加组件进入设置好布局的容器
(4)card.show( con , string a ); //显示容器中名字为a 的组件

(4)GridLayout布局

 英文记忆 :Grid 网格
    GridLayout是使用较多的布局编辑器,将组件划到网格中

(5)NULL布局

可以DIY随意组件的位置 ,例如:p是个容器

   方法:  p.setLayout(  null ) ;

   组件. setBounds( int a  , int b , int width ,int height );
       a  b 代表组件的位置 
       width height代表组建的长和宽

👨‍💻事件👍


(1)DocumentEvent事件


1,事件源

和文本区有关的事件,通过get.Document()返回所维护的文档

2.注册监视器

(xx.getDocument()).addDocummentListener( DocumentListen YY );

3,接口中的方法
方法|描述
-------|--------
public void changedUpDate() | 发出属性或属性集已更改的通知
public void removeUpDate() | 通知文档有删除

public void insertUpDate() | 通知文档有插入)

(2) ActionEvent事件


1.事件源

文本框,按钮,菜单项,密码框和单选按钮都可触发该事件

2.注册监视器

XX.addActionListener( ActionListener YY)

3,接口中的方法
方法|描述
-------|--------
public void actionPerformed( ActionEvent e )| 对发生的事件进行处理

4.ActionEvent类中的方法
方法|描述
-------|--------
public Object getSourse( ) | 可以获取发生ActionEvent事件的事件源对象的引用

public String getActionCommand()| 获取发生ActionEvent事件时和该事件相关的一个“命令”字符串,默认为文本框的文本

(3)MouseEvent事件


1.事件源

MouseListener可以处理5种操作触发的鼠标事件:
(1)事件源上按下鼠标键
(2)事件源上释放鼠标键
(3)事件源上单击鼠标
(4)鼠标进入事件源
(5)鼠标退出事件源头

2.注册监视器

xx.addMouseMOtionLIstener( MouseMotionListener YY)

3.MouseListener接口中的方法

方法 描述
mousePressed(MouseEvent) 负责处理在组件按下鼠标键触发的鼠标事件
mouseReleased(MouseEvent) 负责处理在组件释放鼠标键触发的鼠标事件
mouseEntered(MouseEvent) 负责处理在组件进入鼠标键触发的鼠标事件
mouseExited(MouseEvent) 负责处理在组件离开鼠标键触发的鼠标事件
mouseClicked(MouseEvent) 负责处理在组件单击鼠标键触发的鼠标事件

4.MouseMotionListener 接口中的方法

方法 描述
mouseDragged(MouseEvent) 负责处理拖动鼠标触发的鼠标事件
mouseMoved(MouseEvent ) 负责处理映移动鼠标触发的鼠标事件

5.MouseEvent 类的方法
方法|描述
-------|--------
getX()|获取鼠标指针在事件源坐标系中的X坐标
getY()|获取鼠标指针在事件源坐标系中的Y坐标
getButoon()|获取鼠标的键: 左键 BUTTON1 ,中键 BUTTON2 ,右键 BUTTON3
getClickCount()| 鼠标被单击的次数

getsource()|获取发生鼠标事件的事件源

(4)KeyEvent事件


1.事件源

当按下,释放或敲击键盘上的一个键时就触发了键盘事件

2.注册监视器

xx.addKeyListener(KeyListener YY )

3.KeyListener接口方法
方法|描述
-------|--------
public void keyPressed(KeyEvent e )|处理按下键时的事件
public void keyTyped(KeyEvent e )|处理键入时的事件
public void keyReleased(KeyEvent e )|处理释放键时的事件

4.KeyEvent类方法
方法|描述
-------|--------
public int getKeyCode( )|判断哪个键被按下,敲击或释放
public int getKeyChar( )|判断哪个键被按下,敲击或释放而后返回键上的字符

5,键码表
在这里插入图片描述


(5)windowEvent事件


1.windowEvent类方法
—————————==设置窗口关闭的方式 的方法==———————————— setDefaultCloseOperation( int operation)的 参数常量如下| 常量描述
-------|--------
DO_NOTHTING_ON_CLOSE | 什么也不做
HIDE_ON_CLOSE| 隐藏当前窗口
DISPOSE_ON_CLOASE|隐藏当前窗口并且释放当前窗口占有的其他资源
EXIT_ON_CLOSE|结束窗口所在的应用程序

2.WindowListener接口的方法
方法|描述
-------|--------
public void windowActivated( windowEvent e )| 当窗口从非激活状态到激活状态时
public void windowDeactivated( windowEvent e )| 当窗口从激活状态到非激活状态时
public void windowClosing windowEvent e )| 当窗口正在关闭时
public void windowClosed windowEvent e )| 当窗口关闭后
public void windowOpened windowEvent e )| 当窗口打开时
public void windowIconified windowEvent e )| 当窗口图标化时
public void windowDeiconified windowEvent e )| 当窗口撤销图标化时

你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!

目录
相关文章
|
1月前
|
前端开发 JavaScript
2小时-带你实现-360官网-主题换肤功能
2小时-带你实现-360官网-主题换肤功能
16 1
2小时-带你实现-360官网-主题换肤功能
|
4月前
|
监控 数据可视化
甘特图制作软件精选,在线绘制技巧全掌握
甘特图是一种条状图,用于展示项目任务的进度与时间关系。它有助于增强团队协作、合理分配资源、跟踪项目进度。使用Excel或ZohoProjects等工具可绘制甘特图,其中ZohoProjects支持在线创建。绘制步骤包括:登录Zoho Projects并选择项目,点击“工具”菜单下的“甘特图”,添加任务及其详细信息如名称、日期、负责人等,最后检查并保存甘特图。通过这些步骤,项目管理者能有效监控项目进程。
72 8
|
6月前
|
前端开发
利用 HBuilderX 制作新闻列表页以及制作注册页面
利用 HBuilderX 制作新闻列表页以及制作注册页面
79 2
|
小程序
QT日历制作
QT日历制作
96 0
|
6月前
|
JSON 小程序 安全
【经验分享】如何实现小程序日历范围选择功能
【经验分享】如何实现小程序日历范围选择功能
403 9
|
人工智能 自然语言处理 安全
如何三分钟快速制作自定义ppt
如何三分钟快速制作自定义ppt
152 0
|
BI 数据库连接
机房收费系统——报表下载及模板制作
机房收费系统——报表下载及模板制作
倒计时功能制作
今天制作一个商城项目距离抢购还剩多长时间的一个小功能 首先要知道这个倒计时是不断的变化的,所以需要用到定时器来自动变化(setInterval),有三个标签存放时分秒,再利用innerHTML将计算出来的时间放入三个标签内,第一次执行也是间隔毫秒数,因此刷新页面会有空白,我们最好采取封装函数的方式,这样可以先调用一次这个函数,防止刚开始刷新页面有空白问题。
|
前端开发 JavaScript 容器
开源炫酷日历、网页日历模板、自适应大小日历、win10日历
开源炫酷日历、网页日历模板、自适应大小日历、win10日历
355 0
开源炫酷日历、网页日历模板、自适应大小日历、win10日历
|
JavaScript 前端开发 UED
【组件封装】显示实时时间和星期几·附文字特效
【组件封装】显示实时时间和星期几·附文字特效
【组件封装】显示实时时间和星期几·附文字特效