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组件将只有一个可以被选中,即全部变成单选框组件
    
}
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值