GUI编程
GUI:图形用户接口,用来编写界面的应用程序
1.AWT:抽象窗工具类
图形界面不是JAVA本身实现的,而是依赖于操作系统底层函数,AWTW是所用操作系统共有的底层函数,这样的话功能比较单一
2.Swing
纯java实现的,由于本身不依赖于操作系统的底层函数,组件比较丰富,可以跨平台
普通组件继承图
Object
compoment(组件) menucompoment
Button textFleid list menubar menuItem
按钮 单行文本框 列表框 菜单条 菜单项
others Container menu
其它 容器 菜单
3.容器:可以放其它的组件,一个特殊的组件
容器组件继承关系图
Container
windows panel scrollpanel
窗口 面板 带有滚动的面板
Frame Dialog Applet
创建窗口 对话框
一、窗口的建立
Frame frame=new Frame("这是我");//代表常见的窗口,括号里面可以设置窗口的名称
frame.setSize(20, 30);//设置大小
frame.setLocation(30, 30);//设置位置,
frame.setBounds(30, 30, 300, 200); //前两个是组件左上角在容器中的坐标 后两个是组件的宽度和高度
frame.setVisible(true);//表示frame这个组建显示为可见
//此时单击右上角的X键。该窗口不会被关闭,因为我们还没有写事件响应的代码
* 1.frame的好处是 可以改变窗口的位置、拖拉窗口大小,2.初始化时为不可见,可用setVisible(true)使其显示出来
二、面板的使用
// 面板的使用方法:不是*容器,不能独立使用,必须放到其它容器中
Panel p=new Panel();//代表设置面板
p.add(new TextField(20));
p.add(new Button("发送"));
frame.add(p);//调用P
frame.setBounds(30, 30, 250, 120);
frame.setVisible(true);*/
//乱码?
/*因为AWT是依赖于底层系统的API实现,windows系统默认是gbk,但是我使用的编码集是utf-8所以乱码,怎么解决?
Run As ---Run Configurations
加入Dfile.encoding=gbk
告诉JVM 底层默认字符编码集是gbk即可
三、ScrollPane设置进度条,功能性更强的面板
//也不是*容器,不能独立存在,必须添加到其他容器中
//可作为容器来盛装其他组件,当组件占用空间过大时,ScrollPane自动产生滚动条。当然也可以通过指定特定的构造函数来制定默认具有的滚动条
//注意:ScrollPane中只能放一个子控件,如果想放多个,需要把多个子控件先添加到Panel中,再把panel添加到ScrollPane中
Frame frame = new Frame("演示Panel");
frame.setBounds(30, 30, 250, 120);
//ScrollPane.SCROLLBARS_AS_NEEDED为默认值 需要的时候再显示滚动条
//ScrollPane.SCROLLBARS_ALWAYS一直显示滚动条
ScrollPane scrollPane = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);
Panel panel = new Panel();
//new TextField(20);
panel.add(new TextArea(5,20));// 多行文本输入框设置五行
panel.add(new Button("发送"));
scrollPane.add(panel);
frame.add(scrollPane);
frame.setVisible(true);
四、常见的布局管理器(6种)
//一、流式布局 flowlayout
public class TestFlowlayout {
public static void main(String[] args) {
Frame frame=new Frame("我是窗口");
//setLayout()用来设置容器布置管理器
////从左向右显示 水平间距20px 垂直间距5px
frame.setLayout(new FlowLayout(FlowLayout.RIGHT,20,5));
//居中 frame.setLayout(new FlowLayout(FlowLayout.CENTER,20,5))
/*frame.setLayout(new FlowLayout(FlowLayout.LEFT,20,5));
//Button按钮类*/
frame.add(new Button("按钮1"));
frame.add(new Button("按钮2"));
frame.add(new Button("按钮3"));
frame.add(new Button("按钮4"));
//f.pack()该方法用于调整窗口为最佳大小,用java编写图形用户界面程序时,很少直接设置窗口的大小,通常都是调用该pack()方法来将窗口调整到最佳大小.
frame.pack();//设置窗口为最佳大小(既没有多余位置 也没有遮挡)
frame.setVisible(true);
}
}
//二、边框布局
public class TestBorderLayout {
public static void main(String[] args) {
Frame frame=new Frame("我是窗口");//创建窗口
//BorderLayout将容器分为EAST、SOUTH、WEST、NORTH、CENTER五个区域,普通组件可以被放置在这5个区域的任意一个中
/**/frame.setLayout(new BorderLayout(500,60));//设置水平间距
frame.add(new Button("北"), BorderLayout.NORTH);
frame.add(new Button("南"), BorderLayout.SOUTH);
frame.add(new Button("中"), BorderLayout.CENTER);//BorderLayout.CENTER可加可不加
frame.add(new Button("东"), BorderLayout.EAST);
frame.add(new Button("西"), BorderLayout.WEST);
frame.pack();
frame.setVisible(true);
//当超过 五个元素时需要将第五个元素先放到panel中,再将panel添加到边框布局的容器中
/* frame.setLayout(new BorderLayout(50,60));//设置水平间距
frame.add(new Button("北"), BorderLayout.NORTH);
frame.add(new Button("南"), BorderLayout.SOUTH);
Panel p=new Panel();//设置一个面板
p.add(new TextField(20));
p.add(new Button("单击我"));
p.add(new Button("中"));
p.add(new Button("哈哈"));
frame.add(p);//默认添加到中间区域
frame.add(new Button("东"), BorderLayout.EAST);
frame.add(new Button("西"), BorderLayout.WEST);
frame.pack();
frame.setVisible(true);*/
}
//三、网络布局 Gridlayout
public class TestGridLayout {
public static void main(String[] args) {
Frame frame=new Frame("我是窗口");
/**/frame.add(new TextField(20), BorderLayout.NORTH);//设置一个单行文本框 放置到北边
Panel p=new Panel();//新建一个面板
p.setLayout(new GridLayout(3, 5, 4, 4));//设置面板的布局
String[] s={"0","1","2","3","4","5","6","7","8","9","+","-","*","/","."};
for(int i=0;i<s.length;i++){
p.add(new Button(s[i]));//将数组的内容依次放置到对应的按钮上
}
frame.add(p);//把面板添加到容器中去
frame.pack();//自动整理容器的位置
frame.setVisible(true);//显示可见
}
}
//第四种:卡片布局Cardlayout//
public class TestCardlayout {
private Frame frame = new Frame("测试卡片布局");//新建一个卡片窗口
private Panel panel1 = new Panel();//先间一个面板
private CardLayout cardLayout = new CardLayout();//新建一个卡片
private String[] nameArr = { "第1张", "第2张", "第3张", "第4张", "第5张" };
public static void main(String[] args) {
TestCardlayout test = new TestCardlayout();
test.init();//自定义一个方法
}
public void init() {
panel1.setLayout(cardLayout);//设置卡片
for (int i = 0; i < nameArr.length; i++) {
panel1.add(nameArr[i], new Button(nameArr[i]));
}
frame.add(panel1);//往容器中添加面板
// 设置按钮组panel 用来控制卡片 上一张 下一张
Panel panel2 = new Panel();
// 设置上一张的按钮
Button previousButton = new Button("上一张");
// 给按钮绑定事件
//定义ActionListener用于接收操作事件的侦听器接口
previousButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 上一张
cardLayout.previous(panel1);
}
});
// 设置下一张的按钮
Button nextButton = new Button("下一张");
// 给按钮绑定事件
nextButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 下一张
cardLayout.next(panel1);
}
});
// 设置第一张的按钮
Button firstButton = new Button("第一张");
// 给按钮绑定事件
firstButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 第一张
cardLayout.first(panel1);
}
});
// 设置最后一张的按钮
Button lastButton = new Button("最后一张");
// 给按钮绑定事件
lastButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 第一张
cardLayout.last(panel1);
}
});
// 设置跳到第三张的按钮
Button thirdButton = new Button("第3张");
// 给按钮绑定事件
thirdButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 第一张
cardLayout.show(panel1, "第3张");
}
});
//把这5个按钮放到第二个panel中
panel2.add(previousButton);
panel2.add(nextButton);
panel2.add(firstButton);
panel2.add(lastButton);
panel2.add(thirdButton);
//一共设置了两个面板,上面的默认放置在中间,下面的放在南面
frame.add(panel2,BorderLayout.SOUTH);
frame.pack();//自动调整
frame.setVisible(true);
}
}
//第五种:绝对定位 NullLayout
import java.awt.Button;
import java.awt.Frame;
public class TestNullLayout {
private Frame frame = new Frame("测试窗口");
private Button btn1 = new Button("第一个按钮");
private Button btn2 = new Button("第二个按钮");
public void init(){
//1.设置使用null布局管理器
frame.setLayout(null);
//下面强制设置每个按钮的大小、位置
btn1.setBounds(20, 30, 90, 28);
frame.add(btn1);
btn2.setBounds(50, 45, 120, 35);
frame.add(btn2);
frame.setBounds(0, 0, 200, 100);
frame.setVisible(true);
}
public static void main(String[] args) {
new TestNullLayout().init();
}
}
//第六种方法:BoxLayout布局管理器和Box容器
public class TestBoxLayout {
private Frame f = new Frame("演示BoxLayout");
public void init(){
f.setLayout(new BoxLayout(f,BoxLayout.Y_AXIS ));//Y_AXIS表示垂直分布 X_AXIS表水平分布
f.add(new Button("第一个按钮"));
f.add(new Button("第二个按钮"));
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
new TestBoxLayout().init();
}
}
五、运用以上知识写的小界面
public class 基本组件测试 {
public static void main(String[] args) {
Frame frame=new Frame("基本组件的应用");
Panel panel1=new Panel();
//第一步、设置一个下拉式选择款的组件
Choice colorChoice=new Choice();
colorChoice.add("红车");
colorChoice.add("蓝车");
colorChoice.add("黄车");
panel1.add(colorChoice);
//第二步、设置一个复选框组件,把复选框变成单选框,把单选框添加到组里就好了,同一组的复选框 只能选一个 这样就变成了单选框
CheckboxGroup sexcheckbox=new CheckboxGroup ();
Checkbox malecheckbox=new Checkbox("男", sexcheckbox, true);
Checkbox demalecheckbox=new Checkbox("女", sexcheckbox, false);
Checkbox marriedcheckbox=new Checkbox("是否已婚?",null,false);
panel1.add(malecheckbox);
panel1.add(demalecheckbox);
panel1.add(marriedcheckbox);
//第三步、创建一个垂直的Box 把文本域和复选组件放在垂直的位置
Box box1=Box.createVerticalBox();//创建一个垂直的Box
TextArea text=new TextArea(5,20);//创建一个多行的文本域
box1.add(text);
box1.add(panel1);
//第四步、设置一个水平的Box
Box box2=Box.createHorizontalBox();//创建一个水平的Box
List list=new List();//创建一个文本链表
list.add("兰博基尼");
list.add("GTR");
list.add("法拉利");
box2.add(box1);
box2.add(list);
//第四步、设置一个边框布局把box2的内容和下面的内容分开
//1.先设置一个panel2 2.设置一个单行文本框 3.设置一个BorderLayout布局
Panel panel2=new Panel();
TextField text2=new TextField(50);
panel2.add(text2);
panel2.add(new Button("按钮2"));
frame.setLayout(new BorderLayout());
frame.add(box2);
frame.add(panel2,BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
//注意:TextField()是设置单行文本框 而TextArea(5,20)是可以设置多行文本框
//createVerticalBox()创建一个水平的盒式管理器 createHorizontalBox()创建了一个垂直的盒式管理器
//严格区分边框格局BorderLayout的方向 北:NORTH 南:SOUTH 西:EAST 东:WEST
//CheckboxGroup:用于将多个Checkbox组件合成一组,一组Checkbox组件将只有一个可以被选中,即全部变成单选框组件
}
}
上一篇: GUI编程