👨💻个人主页:@元宇宙-秩沅
**hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!**
本文由 秩沅 原创
收录于专栏 玩归玩闹归闹,别拿java开玩笑
⭐相关文章: ⭐
⭐ GUI实例-之蓝色妖姬 ⭐
@[TOC]
一,效果图
👨💻
二,完整代码
👨💻👍
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 )| 当窗口撤销图标化时
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!