day1&day2-创建窗体
java GUI的类型
1. swing和awt
-
AWT(Abstract Window Toolkit):抽象窗口工具包
awt会使用操作系统本身的图形库进行运行。由于各个操作系统所拥有的图形库内容不同,为了java系统的可移植性,awt取所有的交集。
图形库本身包含的内容比较少,为了实现需要的操作,可能需要另外做一些渲染+flip的工作。相对比较低端,会比较浪费时间(相当于运用控件之前还需要先手动写一个控件) -
Swing:为解决AWT存在的问题而新开发的图形界面包
swing使用java的代码对AWT功能进行扩展。
原本使用AWT时操作系统不支持的控件,使用java代码实现各类控件,进行实现。(用java编写了各类控件,封装在库中) -
区别和联系
AWT使用系统的图形库,由于取交集,所包含的范围比较窄。swing使用java代码模拟控件,不使用本地方法。
AWT使用本地方法,各个平台的图形表现取决于操作系统,但速度快。swing使用库的控件,平台表现一致,运行速度相对慢。 -
参考自:https://blog.csdn.net/iamluole/article/details/8142257
2.swing结构
-
结构图
-
三类容器
-
结构图
-
顶层容器
JFrame:窗口
JDialog:对话框
JApplet:Swing组件中的Java Applet -
中间容器
Jpanel:面板,装载一些容器
JScrolPane:类似JPanel,提供滚动条(Jpanel超出范围的部分无法看到)
JTabbedPane:多任务卡的Panel,类似浏览器的界面切换
JToolBar:工具栏
-
-
参考自:http://c.biancheng.net/view/1206.html
创建一个窗口
1.初始化一个窗口
-
设置标题:setTitle()
-
设置大小:setSize()
-
设置位置:setLocation()
-
设置关闭方法:setDefaultCloseOperation()
- 这是JFrame的方法,setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
- 如果使用AWT的Frame创建窗体,需要另外设置监听事件,在点击关闭键以后运行退出程序
this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });
-
设置窗口可见:setVisible(true)
-
运行
2.添加控件,丰富界面
-
添加panel
import jpanel:import javax.swing.JPanel;
初始化:JPanel panel= new JPanel()
在窗口上添加面板:add(panel); -
添加标签
初始化:JLabel label1= new JLabel()
在面板上添加标签:panel.add(label1) -
运行显示结果
-
参考:http://c.biancheng.net/view/1209.html
3.设置布局,规范化界面
-
布局的作用
控件之间保持相对距离,根据窗口的大小,间距会发生变化
不需要计算距离,也不用担心控件会重叠 -
布局的分类
-
BorderLayout(边框布局管理器)
- 大致分为东南西北中五块
- 不要求每个区域都有组件,如果区域内没有组件,会用center区域补充
- 每个区域只能填充一个组件,后添加的组件会覆盖前一个组件
- 实验代码
setLayout(new BorderLayout()); JPanel panel=new JPanel(); add(panel,BorderLayout.NORTH); JLabel label1=new JLabel("输入网址:"); panel.add(label1); JLabel label2=new JLabel("标签2"); panel.add(label2); JLabel label3=new JLabel("标签3"); add(label3,BorderLayout.SOUTH); JLabel label4=new JLabel("标签4"); add(label4,BorderLayout.SOUTH);
- 显示结果
窗体的布局为borderlayout,north添加了panel作为组件,south则添加了两个标签
panel是一个组件,在panel上添加标签不会产生替换
而直接在布局上添加label,只显示最新的标签
-
FlowLayout(流式布局管理器)
-
根据组件按照从上到下、从左到右的顺序自由添加,可以在构造函数中设置组件之间的间距
-
构造方法
FlowLayout()
FlowLayout(对齐方式) :对齐方式FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER
FlowLayout(对齐方式,横向间距,纵向间距) -
实验代码
setLayout(new FlowLayout(FlowLayout.LEFT,20,20)); JPanel panel=new JPanel(); panel.setBackground(Color.white); add(panel); JLabel label1=new JLabel("输入网址:"); panel.add(label1); JLabel label2=new JLabel("标签2"); panel.add(label2); JLabel label3=new JLabel("标签3"); add(label3); JLabel label4=new JLabel("标签4"); add(label4);
-
实验结果
-
-
CardLayout(卡片布局管理器)
具有show方法显示某个panel
图示代码
在p1上添加3个按钮,在p2添加3个文本框。
界面上添加卡片式布局的panel,向这个panel添加p1和p2
显示面板
CardLayout cl=(CardLayout)(cards.getLayout());
cl.show(cards,“card1”); //调用show()方法显示面板2
show哪个面板,显示哪个面板(有button按钮触发会更直观) -
GridLayout(网格布局管理器)
-
可以创建指定行和列的布局
-
构造方法
GridLayout(行数,列数)
GridLayout(行数,列数,横向间隔,纵向间隔) -
显示结果
-
-
GridBagLayout(网格包布局管理器)
-
BoxLayout(盒式布局管理器)
-
-
参考:http://c.biancheng.net/view/1212.html
4.添加文本框和按键
-
添加文本框
-
构造方法
JTextField()
JTextField(初始化内容)
JTextField(宽度)
JTextField(内容,宽度) -
实验代码
JTextField text1=new JTextField(35); panel.add(text1);
-
结果
-
参考:http://c.biancheng.net/view/1219.html
-
-
添加按钮
-
构造方法
JButton()
JButton(图标)
JButton(文字)
JButton(文字,图标) -
添加事件监听
- 引入包:import java.awt.event
- 对button进行动作监听:button.addActionListener()
- 新建动作监听函数函数:new ActionListener()
- 有该动作,进行事件触发:public void actionPerformed(ActionEvent e)
- 完整实践监听代码
button1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { text1.setText("yes!"); // functions.catchContent( text1.getText() ); } });
-
-
实验效果
-
参考:http://c.biancheng.net/view/1235.html