黑马程序员—java基础—GUI图形用户界面编程

                                                             ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

 

GUI图形用户界面编程,就是使用GUI编程

GUI是图形用户接口,CLI是命令行用户接口

GUI:

Graphical User Interface(图形用户接口)。
用图形的方式,来显示计算机操作的界面,这样更方便更直观。
CLI:
Command line User Interface (命令行用户接口)
就是常见的Dos命令行操作。
需要记忆一些常用的命令,操作不直观。

awt和swing包的概述:

java.awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。javax.swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。

黑马程序员—java基础—GUI图形用户界面编程_第1张图片

简单窗体的创建过程:

•Frame  f = new Frame(“my window”);
•f.setLayout(new FlowLayout());
•f.setSize(300,400);//设置窗体大小
•f.setLocation(300,200);//设置窗体出现在屏幕的位置
•f.setVisible(true);

案例:第一个HelloWorld窗体:

mport java.awt.Dimension;
import java.awt.Frame;
import java.awt.Point;

/*
 * 第一个窗体:
 * 
 * 1.实例化一个Frame对象;
 * 		构造方法:
 * 			Frame():构造一个最初不可见的 Frame 新实例()。 
 * 			Frame(String title) :构造一个新的、最初不可见的、具有指定标题的 Frame 对象 
 * 2.成员方法:
 * 		使窗体可见:setVisible(boolean b):
 * 		设置窗体的大小:setSize(int width,int height):
 * 				   setSize(Dimension d):
 * 		设置窗体的位置:setLocation(int x ,int y):
 * 				   setLocation(Point p):
 * 		设置窗体标题:setTitle(String title):
 * 
 * 		一次设置窗体的大小和位置:setBounds(int x,int y,int width,int height)
 * 		
 */
public class Demo {
	public static void main(String[] args) {
		//1.实例化一个窗体
		Frame f = new Frame();
		//2.设置窗体大小
	//	f.setSize(500,400);
	//	f.setSize(new Dimension(500,400));
		//3.设置窗体位置
	//	f.setLocation(400, 150);
	//	f.setLocation(new Point(400,150));
		
		//一次设定大小和位置
		f.setBounds(400, 150, 500, 400);
		//设置标题
		f.setTitle("HelloWorld");
		//4.显示窗体
		f.setVisible(true);
	}
}

事件处理机制:

import java.awt.Frame;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

/*
 * 事件处理机制:
 * 
 * 我们要关注几个点:
 * 
 * 1.事件源:谁会出事:任何组件;
 * 	  例如:窗体--Frame
 * 2.可能会出什么事:在Java类库中已经定义好的:键盘事件、鼠标事件、焦点事件......XxxxListener
 * 	 例如:我们的窗体,需要关注"窗体事件"--WindowListenr
 * 3.如果出事了,做什么事情:自定义类,继承自某个Listener,然后重写我们要关注的方法;
 *  例如:我们的窗体,要关注"窗体事件",所以,我们自定义类,实现WindowListener接口,实现:windowClosing()方法;
 * 	
 * 4.将"事件源(1)"和"事件处理(3)"进行关联:调用组件的addXxxxListener(自定义类的对象);
 */
public class Demo {
	public static void main(String[] args) {
		Frame f = new Frame("可以关闭的窗体");
		f.setBounds(400, 150, 500, 400);
	//	f.addWindowListener(new MyWindowListener());
		//使用匿名内部类
		f.addWindowListener(new WindowListener(){
			@Override
			public void windowOpened(WindowEvent e) {
				// TODO Auto-generated method stub
			}
			@Override
			public void windowClosing(WindowEvent e) {
				// TODO Auto-generated method stub
				System.out.println("匿名内部类,我被关闭了,拜拜......");
				System.exit(0);
			}
			@Override
			public void windowClosed(WindowEvent e) {
				// TODO Auto-generated method stub
				
			}
			@Override
			public void windowIconified(WindowEvent e) {
				// TODO Auto-generated method stub
			}
			@Override
			public void windowDeiconified(WindowEvent e) {
				// TODO Auto-generated method stub
			}
			@Override
			public void windowActivated(WindowEvent e) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public void windowDeactivated(WindowEvent e) {
				// TODO Auto-generated method stub
				
			}
			
		});
		f.setVisible(true);
	}
}

GUI中的适配器模式简介:

适配器模式:

1.假如我开发了一个接口,会被其它同事使用,我的接口定义:
  interface IA{
   public void show1();
   public void show2();
   public void show3();
   public void show4();
   public void show5();
   public void show6();
   public void show7();
  }
2.当同事使用这个接口时,可能只需要几个方法,不需要全部,但同事们不得不全部实现:
  class SubA implements IA{
   public void show1(){
    System.out.println("我只需要show1()方法");
   }
   public void show2(){
   }
   ......
   其它方法必须要实现,否则不能通过编译
   所以这里不得不空实现,降低可读性;
  }
3.这时,我又做了件事情:为接口定义了"抽象类":
  abstract class AbstractA implements IA{
   public void show1(){};//空实现
   public void show2(){};
   public void show3(){};
   public void show4(){};
   public void show5(){};
   public void show6(){};
   public void show7(){};
  }
   这时,同事如果只需要几个方法,可以继承自我这个抽象类,只需要重写他所需要的方法即可:
  class SubA extends AbstractA{
   public void show1(){
    System.out.println("只需要重写show1()方法,其它方法不用管");
   }
  }
4.此例中的"AbstractA"就是"IA"接口的"适配器",这种实现方式就是:适配器模式
案例:使用适配器模式更改关闭案例:

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Demo {
	public static void main(String[] args) {
		Frame f = new Frame("使用适配器模式");
		f.setBounds(400, 150, 500, 400);
		f.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e) {
				System.out.println("你要关闭我了?好吧,拜拜......");
				System.exit(0);
			}
		});
		f.setVisible(true);
	}
}

为窗体添加按钮并添加事件:

import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Random;
/*
 * 为按钮添加事件:
 * Button but = new Button("按钮");
 * but.addMouseListener();
 * 或者:
 * but.addActionListener()(常用):语义事件,表示用户按了一下鼠标;
 */
public class Demo {
	public static void main(String[] args) {
		Frame f = new Frame("使用适配器模式");
		f.setBounds(400, 150, 500, 400);
		f.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e) {
				System.out.println("你要关闭我了?好吧,拜拜......");
				System.exit(0);
			}
		});
		//添加按钮
		Button but1 = new Button("but1");
		Button but2 = new Button("but2");
		Button but3 = new Button("but3");
		Button but4 = new Button("but4");
		Button but5 = new Button("but5");
		Button but6 = new Button("but6");
		
		but1.setBounds(10, 40, 100, 30);
		
		but2.setBounds(130, 50, 80, 40);
		
		but3.setBounds(80, 100, 100, 30);
		but4.setBounds(180, 130, 120, 40);
		
		but5.setBounds(120, 250, 100, 30);
		but6.setBounds(200, 280, 110, 40);
		
		//将按钮添加到窗体上
		f.setLayout(null);
		f.add(but1);
		f.add(but2);
		f.add(but3);
		f.add(but4);
		f.add(but5);
		f.add(but6);
		
		//将六个按钮全部隐藏
		final Button[] butArray = new Button[6];
		butArray[0] = but1;
		butArray[1] = but2;
		butArray[2] = but3;
		butArray[3] = but4;
		butArray[4] = but5;
		butArray[5] = but6;
		
		for(Button but : butArray){
			but.setVisible(false);
		}
		
		
		Button butStart = new Button("开始");
		butStart.setBounds(30,330, 150, 40);
		f.add(butStart);
		butStart.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("鼠标按下并释放......");
				new Thread(){
					public void run() {
						Random rdm = new Random();
						while(true){
							int index = rdm.nextInt(butArray.length);
							//遍历数组,将index位置上的but显示出来,其它的全部隐藏
							for(int i = 0;i < butArray.length ; i++){
								if(i == index){
									butArray[i].setVisible(true);
								}else{
									butArray[i].setVisible(false);
								}
							}
							try {
								Thread.sleep(700);
							} catch (InterruptedException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							}
						}
					};
				}.start();
			}});
		/*butStart.addMouseListener(new MouseListener(){
			@Override
			public void mouseClicked(MouseEvent e) {
				System.out.println("鼠标按下并释放......");
				new Thread(){
					public void run() {
						Random rdm = new Random();
						while(true){
							int index = rdm.nextInt(butArray.length);
							//遍历数组,将index位置上的but显示出来,其它的全部隐藏
							for(int i = 0;i < butArray.length ; i++){
								if(i == index){
									butArray[i].setVisible(true);
								}else{
									butArray[i].setVisible(false);
								}
							}
							try {
								Thread.sleep(700);
							} catch (InterruptedException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							}
						}
					};
				}.start();
				
			}

			@Override
			public void mousePressed(MouseEvent e) {
				// TODO Auto-generated method stub
				System.out.println("鼠标按下......");
			}

			@Override
			public void mouseReleased(MouseEvent e) {
				// TODO Auto-generated method stub
				System.out.println("鼠标释放......");
			}

			@Override
			public void mouseEntered(MouseEvent e) {
				// TODO Auto-generated method stub
				System.out.println("鼠标移入......");
			}

			@Override
			public void mouseExited(MouseEvent e) {
				// TODO Auto-generated method stub
				System.out.println("鼠标离开......");
			}});*/
		f.setVisible(true);
	}
}

把文本框的值移到文本域的案例:

import java.awt.Button;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/*
 * 把文本框的值转移到文本域案例
 * 
 * 1.需要的组件:
 * 		1).窗体:Frame
 * 		2).文本框:TextField
 * 				成员方法:
 * 					1>.获取文本内容:getText()
 * 					2>.设置文本内容:setText()
 * 					3>.获取焦点:requestFocusInWindow()
 * 		3).按钮:Button
 * 		4).文本域:TextArea
 * 					1>.获取文本内容:getText();
 * 					2>.设置文本内容:setText();
 * 
 * 
 */
public class Demo {
	public static void main(String[] args) {
		Frame f = new Frame("将文本框中的数据移动到文本域");
		f.setBounds(400, 150, 500, 400);
		f.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		//添加组件
		final TextField txt = new TextField(20);
		txt.setBounds(120, 50, 180, 25);
		
		Button but = new Button("数据转移");
		but.setBounds(320, 50, 80, 25);
		
		final TextArea txtArea = new TextArea();
		txtArea.setBounds(100, 90, 320, 230);
		//为按钮添加事件:
		but.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				//1.获取文本框中的值:
				String info = txt.getText();
				System.out.println(info);
				//2.将数据转移到文本域
				String old = txtArea.getText();
				old += info + "\r\n";
				txtArea.setText(old);
				
				//3.清空文本框
				txt.setText("");
				//4.让文本框获取焦点
				txt.requestFocusInWindow();
				
			}});
		//使用绝对位置定位
		//1.将窗体的布局管理器设为null
		f.setLayout(null);
		
		f.add(txt);
		f.add(but);
		f.add(txtArea);
		//**************************
		f.setVisible(true);
	}
}

f.setBackground(Color.red);  一个方法,更改窗体背景颜色

菜单案例:

一级菜单:

import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/*
 * Java中的菜单:
 * 
 * 1.菜单栏:MenuBar
 * 2.菜单:Menu
 * 3.菜单项:MenuItem
 */
public class Demo {
	public static void main(String[] args) {
		final Frame f = new Frame("一级菜单");
		f.setBounds(400, 150, 500, 400);
		f.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		//制作菜单
		//1.菜单栏
		MenuBar bar = new MenuBar();
		//2.菜单:文件
		Menu menu = new Menu("文件");
		//3.菜单项:退出系统
		MenuItem item = new MenuItem("退出系统");
		item.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.exit(0);
			}});
		//菜单添加菜单项
		menu.add(item);
		//菜单栏添加菜单
		bar.add(menu);
		//窗体添加菜单栏
		f.setMenuBar(bar);
		f.setVisible(true);
	}
}

多级菜单案例:

import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;

public class Demo {
	public static void main(String[] args) {
		final Frame f = new Frame("多级菜单");
		f.setBounds(400, 150, 500, 400);
		f.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		//制作菜单
		MenuBar bar = new MenuBar();
		
		Menu menu1 = new Menu("文件");
		Menu menu2 = new Menu("更改标题");
		
		MenuItem item1 = new MenuItem("打开记事本");
		item1.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				Runtime rt = Runtime.getRuntime();
				try {
					rt.exec("notepad");
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}});
		MenuItem item2 = new MenuItem("退出系统");
		item2.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}});
		MenuItem item3 = new MenuItem("好好学习");
		item3.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {
				f.setTitle("好好学习");
				
			}});
		MenuItem item4 = new MenuItem("天天向上");
		item4.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {
				f.setTitle("天天向上");
			}});
		MenuItem item5 = new MenuItem("恢复标题");
		item5.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {
				f.setTitle("多级菜单");
			}});
		//关联菜单
		menu2.add(item3);
		menu2.add(item4);
		menu2.add(item5);
		
		menu1.add(menu2);
		menu1.add(item1);
		menu1.add(item2);
		
		bar.add(menu1);
		
		f.setMenuBar(bar);
		f.setVisible(true);
	}
}



 

你可能感兴趣的:(黑马日志)