Java - Swing设计与MVC模式¶
Swing

组件:
最外层的窗体叫做JFrame:
可以下拉的菜单:
JLable:呈现文字/图像的容器,带有背景.

1. 大致了解一下项目结构;
2. 界面默认是隐藏的,因此需要设置可见性.
这样可以一下子弹出来三个界面.
我们需要解耦合.
主界面:
这个继承非常巧妙.
其余两个界面也是同理.
创建:
一些设置:
AlwaysOnTop主要是使得界面一直在最上面,即使鼠标移出窗口,也是如此.
这样窗口弹出的时候就会出现在屏幕中间.
这样点击右上角的× 后,程序也会一同结束.否则,即使退出了窗口,虚拟机还在运行.
3是什么?
可以发现,这也是接口的作用之一.
0:点x会没有任何效果.
2:所有的界面都这么设置才有效果.当所有界面都x掉之后,会关掉进程.
3.x掉一个,会关闭掉进程.
为什么是3?因为我们的界面是不会同时出现的.x掉一个就要全关了.
菜单创建:
当然,这也是可以抽取出来的

游戏界面图片:ImageIcon
我们需要管理15张图片的结构:设置JLabel来托管.
抽出方法
图片都是默认在最中间的.因此想要依次排放,就需要坐标.
图片由于是105x105的.我们直接设置会发现还是中间.
因此,需要修改一下隐藏容器.隐藏容器是Jframe创建时默认创建的隐藏根容器.
注意,setBound是设置JLabel相对于父控件的位置.x,y是左上角的位置.
隐藏容器是会自动添加的.
我们如果想把"默认最中间"取消,就需要setLayout(null);

这样就成功创建一个图片了.同样的,循环加图片 :
由于我们只有1-15的图片,因此右下角的图片加载不出来.成为一个空白.这是正常的.
打乱图片:
省略不写了.思路不难.
事件:

动作监听:监听鼠标的时候只能监听点击,监听键盘的时候只能监听空格.
按钮:
这是一个动作监听
传递的参数必须是个接口实现类的对象.
当然可以用匿名内部类:

- 当然,这样写还是太麻烦了.可以让当前界面重写:
传递this就行:
重写的触发的函数可以统一写成这样:
别忘了添加:

事件:
鼠标实际上有四个动作:

其中还有单击动作 一般认为"按下并释放"鼠标按钮 会触发单击动作.
一共有五种回调函数.
注意要给按钮添加绑定才有效果
第三个方法基本不用.
需要重写这三个:
如果我们一直按着不送,那么会刷屏:
如何区分按键?
按下a的效果:
这其实和acill码并不是一一对应,只是巧合罢了.因此我们需要知道对应关系.
美化:
先移动到中间:直接给每个图片都添加一个偏移量就行:
当然,这个偏移量需要自己调.
添加背景图片也需要调参数.
但是这添加之后,图长这样:
因此是添加顺序不对.应该先添加循环,再添加图片.
结论:先加载的图片在上方,后加载的图片在下方.
怎么记?改需求的时候,新加的代码往往在原先代码的后面.为了不影响原先的呈现效果,因此会被放在下面.
添加边框:给Label添加就行:
注意,添加边框之后根本不需要调整原先图片的位置.
回过头来,发现路径太长了,不好看,怎么办?写成相对路径.相对路径是相对于当前项目的.
如:

向上移动:把空白方块下方的图片上移
先实现监听:
怎么获得上下左右?
打印就行.不过也可以记一下 左上右下.
为什么要release时触发?因为长按时会导致连续触发Pressed.
怎么重写改变图片呢?我们刚刚对图片的绘制进行了封装,因此直接调用就行了.
但是似乎没有效果?这是因为,initImage方法里需要先清空原来的图片.
末尾需要刷新界面:

总结:绘制先封装,开头先清空,末尾需刷新
二维数组是"数据",绘制是"界面".每次绘制时,通过数据来进行绘制.这就是MVC
当然,这样写其实耦合性太强了.可以抽取出公共部分的.
松开:只需要在release函数里添加:
即可.
更改图片:
我们发现initImage当中加载的图片是写死的.但是实际上,图片路径应该是"数据",在MVC中应该抽取出来的.

如果我们想设置:按下W会使得图片全部归位. 那么只需要控制release时,如果是w,那么就修改二维数组的数据,使得归位即可.然后调用initImage. 这里,MVC模式就显现出来了.
不过显示胜利的图片时,还能上下左右,如何解决?


1.继承
但其实感觉匿名内部类应该比较好.但这样也能写.在我们处理点击事件的时候:
当然,这样就需要把这些Item抽取出来,放到成员变量里了.

重新登录:
退出:

弹窗对象jDialog:

嵌套菜单:
登录页面:
注意,button是有默认边框的,我们可以去掉.
这里面所有组件都是通过直接设置像素位置做到的,没有使用布局管理器.
一个细节:

打包成exe

jar文件其实是包含了.class文件的压缩包.它当中可以不包含.java代码,也可以包含,取决于打包的方式.
注意,在IDEA当中图片资源是相对于项目的路径.但是打包成exe后是这样的:
图片的路径则是相对于exe的路径了.
注:上图就是打包后的结果.
补充一些API:
设置任务栏图标:
也就是Windows任务栏当中的图标,如这些:
