前言
GUI虽然不是我们软件构造课程的核心思想所在,但是却往往代表着一个软件设计者外在而直接的品味。当然抛开这些不谈,初次接触GUI如我,因为毫无基础,面对网上鱼龙混杂的说法真的尝试而且崩溃了好久,多亏陶神佬相助为我仙人指路,让我得以系统性的接触并且学习了相关的知识。这里逐步整理一下我的心得。因为内容较多,可能需要多更新几回…(如果您着急去实现您的GUI模块,请直接去参考下面的标准流程部分的内容,不过为了大家都健康的完成实验,我不会透漏任何相关的代码)
JFrame是什么
通过阅读书籍,发现JFrame和swing的历史是一个有意思的话题。
JFrame顾名思义,是一个框架,就像盖楼所需要的脚手架,制作手机所需要的内载主板一样,是一个其他组件的承载体。而组件都有什么呢:JLabel,JTable,JPanel等等都是组件,他们从不同功能不同角度实现了使用者所需要在GUI呈现的一些子结构。打比方说这些组件就像是要在手机主板上安装的摄像头,芯片,(对,我就是要讽刺P40pro,所以把摄像头放前面说),你可以根据自己的品味,或者硬性需求制作出摄像头,制作出芯片,制作出时钟,再组装到主板,也就是JFrame这个搭框架里。你可以指定他们相对于主板的位置,也可以指定它们的大小,这样逐步你就确定了这么一个整体的呈现。而且你会突然意识到这么做的意义:结构层次变得特别分明,分工比较明确,结构感特别强。
FirstThingFirst
JFrame本身也是一个对象,JTable,JLabel也是对象。我们要产生这些组件首先要创建对象。
JFrame jfra = new JFrame("Title");
Jlabel jlab = new ....
JTable jtab = new ...
...
对象就有自己的属性。那么作为GUI,我们最关心的属性是什么?位置和大小。
而想要设置这些对象的大小,我们要使用的是它们都具有的方法setBounds
(然而在经典的操作中,我们往往对于JFrame使用setLocation和setSize,而对于他的子组件使用setBounds这个方法,但其实都是可以互相使用的)
下面我都说明一下:
setLocation( x , y )
顾名思义,就是设置位置,可以认为是设置这个窗口左上角所在的坐标。
setSize( w, h )
顾名思义,设置宽和高,设置大小。
setBounds( x , y , w , h )
类似于setLocation和setSize的集合体,四个参数相当于确定了一个矩形,即先确定左上角那个顶点所在的坐标,然后再用宽和高确定出来大小。
在我们使用的时候要注意:多个组件被设置的时候不能冲突,比如你要把四个组件从上到下依次排布,你应该注意计算好他们的纵坐标,一定不能冲突,否则会引发很奇怪的效果。
注意,这里面设置的位置都是相对位置,相对于什么呢?JFrame相对于桌面,JTable等各种组件相对于加入到的JFrame,值得注意的另一点是,你现在只是set了属性,还并没有将其建立联系,也就是说,你还需要将这些东西加入到我们的JFrame类型对象中。
jfra.setLocation(300,400);
jfra.setSize(600,600);
jlab.setBounds(0,0,300,20);
jtab.setBounds(0,20,300,20*jtaNum);
//注意这里面我得jtab是直接承接jlab的位置,
//所以说因为jlab的总左边占据的是0到20,最后我jtab就得是从20起,
//当然也可以再往下挪一下
...
...
好了,我们现在就来加入。很简单
什么是布局
布局是GUI模块提供的一个可以初步帮助使用者完成分布的架构。java中的布局有很多,当然我们这里面需要的可能是box 或者border。也可以不用,所以需要的同学可以自行百度一下。
JFrame设计的标准流程参考(方便快速使用)
JFrame jf = new JFrame("Name");
jf.setLocation(..,..);
jf.setSize(..,..);
//备注,上面两句话设置边界和左上角点所在的位置和拉出来的方块的大小,这两句话可以被一句setBounds取代,下同
JTable jt= new JTable();
jt.setLocation(..,..);
jt.setSize(..,..);
JPannel jp = new JPannel ();
jp.setBounds(..,..,..,..);
......
jf.add(jt);
jf.add(jp);
...
jf.setVisible(true);
多线程与动态显示
这里面,如果你想要在board里面实现实时动态显示时间的组件,就相当于你需要先实现一个实时显示的时钟。
实现的方法是使用runnable接口。
首先声明一个类,实现runnable,
public class MyTime extends JFrame implements Runnable
然后复写run方法,核心思想是每隔十毫秒重新读取一次信息(别的都没变化,其实就是calendar.getInstance中的当前时间发生了变化)
@Override
public void run() {
while(true) {
try {
Thread.sleep(10);
time.setText(format.format(Calendar.getInstance().getTime()));
} catch (Exception e) {
throw new RuntimeException("发生工作异常");
}
}
}
最后在我们的使用位置运行它(需要拉出来一个新的线程,因为我们是在这一部分单独刷新,不想波及到其他部分)
MyTime time = new MyTime(jFrame, classLocation.getName());
new Thread(time).start();
good good study,day day up!!
转载:https://blog.csdn.net/weixin_43197820/article/details/105902572