Swing
一、历史
1.1SUN Jdk 1.1 AWT,控件很少,不方便开发
1.2SUN Jdk 1.2Swing基于AWT的绘图功能重绘的界面组件,提供了及其丰富的控制
a.性能慢
b.结构优秀(MVC)
c.实际应用很少
1.3 IBM提供了SWT
a.采用了本地的C代码完成控件绘制,性能很好
b.实际应用不多
二、Swing的应用
1.JFrame代表一个窗口控件,包括标题栏、控制按钮和边框,中间是内容面板
2.JLabel用来在GUI上显示Text或者图片
3.面板(JPanel)用来组织控件的矩形区域
三、布局管理(布局就是控制组件在面板中的显示位置)
1.空布局(绝对位置布局)
JFrame(width,high);
JPanel(width,high);
JButton OK(x,y,w,h);
绝对位置布局不是很好用。
实例:
<span style="white-space:pre"> </span>public static void main(String[] args) {
//绝对位置布局
JFrame win=new JFrame("Null layout");
win.setSize(574,390);<span style="white-space:pre"> </span>//设置窗口大小
JPanel content=new JPanel();
content.setLayout(null);<span style="white-space:pre"> </span>//空布局,不要忘了写
win.setContentPane(content);
JButton ok=new JButton("OK");<span style="white-space:pre"> </span>//OK按钮
content.add(ok);<span style="white-space:pre"> </span>//将OK按钮加到content布局中
ok.setLocation(370, 327);<span style="white-space:pre"> </span>//设置按钮相对于content最左上一点的坐标
ok.setSize(92,21);<span style="white-space:pre"> </span>//设置按钮的大小
JButton cancel=new JButton("Cancel");
content.add(cancel);
cancel.setLocation(466, 327);
cancel.setSize(92,21);
win.setVisible(true);
}
2.布局管理器(相对位置布局,组件的大小和位置由布局控制)
A.BorderLayout(边框布局)
将一个面板分为东南西北中,每个位置只能放一个控件,“中”会自动的向其它的四个方向填充
-------------------------------------
| 北(North) |
-------------------------------------
|西| 中 |东 |
| | | |
-------------------------------------
| 南 |
-------------------------------------
B.FlowLayout(流布局)
每个元素顺序排列,一行满了,排下一行
C.GridLayout表格布局
指定行数,列数,元素按照等宽的行列表格进行布局
四、工厂方法
封装复杂的对象创建过程的方法
界面的设计:
1.创建类LoginFrame继承于JFrame
1.1提供构造器,构造器中调用init()方法
1.2init()方法用来初始化全部界面组件,就是来画界面
1.3添加showView()用来显示界面
1.4提供测试类来进行单元测试
2.完成界面初始化代码
实例:
public class ExamFrame extends JFrame{
public ExamFrame() {
init();
}
private void init(){<span style="white-space:pre"> </span>//初始化全部界面组件
setTitle("在线测评");<span style="white-space:pre"> </span>//设置标题
setSize(400,500);<span style="white-space:pre"> </span>//设置界面大小
setContentPane(createContentPane());//初始化内容面板
}
private JPanel createContentPane(){
JPanel pane=new JPanel(new BorderLayout());
ImageIcon icon=new ImageIcon(getClass().getResource("12.png"));//插入一个图片
pane.add(BorderLayout.NORTH,new JLabel(icon));
pane.add(BorderLayout.CENTER,createCenterPane());<span style="white-space:pre"> </span>//初始化中间部分的面板
pane.add(BorderLayout.SOUTH,createToolPane());<span style="white-space:pre"> </span>//初始化工具栏
return pane;
}
private JPanel createCenterPane(){<span style="white-space:pre"> </span>//中间部分面板
JPanel pane=new JPanel(new BorderLayout());
pane.add(BorderLayout.NORTH,new JLabel("姓名:XXX,考试:XXX,考试时间:XXX",JLabel.CENTER));//北,居中显示
pane.add(BorderLayout.CENTER,createQuestionPane());<span style="white-space:pre"> </span>//初始化问题面板
pane.add(BorderLayout.SOUTH,createOptionsPane());<span style="white-space:pre"> </span>//初始化选项面板
return pane;
}
private JPanel createOptionsPane(){
JPanel pane=new JPanel();
JCheckBox a=new JCheckBox("A");<span style="white-space:pre"> </span>//CheckBox选择按钮
JCheckBox b=new JCheckBox("B");
JCheckBox c=new JCheckBox("C");
JCheckBox d=new JCheckBox("D");
pane.add(a);
pane.add(b);
pane.add(c);
pane.add(d);
return pane;
}
private JScrollPane createQuestionPane(){<span style="white-space:pre"> </span>//以这样的方式创建一个可以下拉的显示文件内容区域
JScrollPane pane=new JScrollPane();
JTextArea questionArea=new JTextArea();
questionArea.setText("问题\nA.\nB.");
pane.getViewport().add(questionArea);
return pane;
}
private JPanel createToolPane(){
JPanel pane=new JPanel(new BorderLayout());
pane.add(BorderLayout.WEST,new JLabel("题目20的第1题"));
pane.add(BorderLayout.CENTER,createBtnPane());
pane.add(BorderLayout.EAST,new JLabel("剩余时间222秒"));
return pane;
}
private JPanel createBtnPane(){<span style="white-space:pre"> </span>//初始化按钮面板
JPanel pane=new JPanel();
JButton next=new JButton("下一题");
JButton last=new JButton("上一题");
JButton handin=new JButton("交卷");
pane.add(next);
pane.add(last);
pane.add(handin);
return pane;
}
public void showView(){<span style="white-space:pre"> </span>//显示界面
setVisible(true);
}
}
转载请注明出处