最近几天一直在用swing写TTMS的界面层,以前从没用过Swing图像库,所以也算是边学边用把,下面记录一些注意的地方。
JFrame JPanel区别
形象的说,JFrame相当于桌子,JPanel相当于桌布。一个桌子上可以放很多桌布。所以一个JFrame可以add很多个JPanel。而其他的JButton,JLabel之类就相当是桌子上的水杯烟灰缸之类的了。
布局管理器及一些坑
首先,按照标准的写法来,我们至少会给桌子上铺一个桌布,再摆放水杯。而桌布有很多的摆放水杯的方案,最简单的是null(时间关系不能学习其他复杂的布局),由于它完全按你指定的位置来摆放,固然有很多的不足,最明显的就是对窗口进行大小的修改(如最大化),部件的大小不会随之改变,甚至有可能消失(如你在最右边放了一个按钮,用户将窗口变小这个按钮因为跑到窗口外面去了,所以就看不到了。那么我们的解决方案就是把窗口设置成不能改变大小。
JFrame frame = new JFrame();
JPanel panel = new JPanel();
frame.setSize(400,300);//窗口大小400*300
frame.setResizable(false); //设置大小不可变
frame.setTitle("标题");
frame.setLocationRelativeTo(null);窗口居中
panel.setLayout(null);//无布局
frame.add(panel);
frame.setVisible(true);//这句一定要放在添加完所有部件的后边,否则可能有些部件不能立即显示
一个桌子铺上多个桌布
JPanel有一个setSize(width,hight)来设置桌布的大小,如果我们有多个桌布,最好用setBounds(x,y,width,hight),为什么?原因如下,首先,setSize只能设置桌布的大小,不能设置它放在桌子的哪个位置,比如:
有一个100*100的桌子,我想把他们一分为二,那么用setSize()必须设置一个50*100和100×100的桌布,这样以来会产生覆盖问题,造成很大的不便,如我对大桌布执行了一次removeAll()方法(拿到大桌布上所有的东西),然后执行repaint()方法(重新显示),这的结果就是小桌布的东西也看不到了,相当与我把大桌布盖在小的上边了。
使用setBounds(),我们,设置两个等大的桌布,分别setBounds(0,0,50,100)、setBounds(50,0,50,100),这样两个桌布就是并不相互重叠的摆放好了,互相之间不会产生操作影响。
//核心代码
JFrame a = new JFrame();
a.setSize(100,100);
JPanel b = new JPanel();
JPanel c = new JPanel();
b.setBounds(0,0,50,100);
c.setBounds(50,0,50,100);
a.add(b);
b.add(c);