欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

GUI编程

程序员文章站 2022-03-08 10:24:15
...

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