黑马程序员——GUI

------- android培训java培训iOS培训.Net培训期待与您交流! ----------


GUI:Graphical User Interface(图形用户接口)

用图形的方式来显示计算机操作的界面,这样更方便更直观

CLICommand Line Interface(命令行用户接口)

就是常见的Dos命令行操作,需要记忆一些常用的命令,操作不直观

JAVAGUI提供的对象都存在java.Awtjavax.Swing两个包中

GUI布局:容器中的组件的排放方式

常见的布局管理器

FlowLayout(流式布局管理器):从左到右的顺序排放,Panel默认的布局管理器

BorderLayout(边界布局管理器):东、南、西、北、中,Frame默认的布局管理器

GridLayout(网格布局管理器):规则的矩阵

CardLayout(卡片布局管理器):选项卡

GridBagLayout(网格包布局管理器):非规则的矩阵

创建图形化界面

1.创建Frame窗体

2.对窗体进行基本设置,比如大小,位置,布局

3.定义组件

4.将组件通过窗体的add方法添加到窗体中

5.让窗体显示,通过setVisible(true)

import java.awt.*;
class  AwtDemo
{
	public static void main(String[] args) 
	{
		Frame f=new Frame("my awt");//构造一个最初不可见的,具有指定标题(my awt)的Frame对象

		f.setSize(500,400);//设置长和宽,500长,400宽

		f.setLocation(300,200);//设置Frame对象(窗口)弹出时所在位置

		f.setLayout(new FlowLayout());//设置按钮的布局(流式布局)

		Button b=new Button("我是一个按钮");//设置按钮
		f.add(b);//把按钮添加到Frame对象中

		f.setVisible(true);//根据参数值显示或隐藏此组件,true代表可见
	}
}

事件监听机制组成事件源(组件)、事件(Event)、监听器(Listener)、事件处理(引发事件后处理方式)

事件监听机制流程图


事件监听机制的特点

事件源:就是awt包或者swing包中的那些图形界面组件

事件:每一个事件源都有自己特有的对应事件和共性事件

监听器:将可以触发某一个事件的动作(不只一个动作)都已经封装到了监听器中

以上三者,在java中都已经定义好了,直接获取其对象来用就可以了。

我们要做的事情是,就是对产生的动作进行处理

窗体事件

import java.awt.*;
import java.awt.event.*;
class  AwtDemo
{
	public static void main(String[] args) 
	{
		Frame f=new Frame("my awt");//Frame窗体为事件源

		f.setSize(500,400);

		f.setLocation(300,200);

		f.setLayout(new FlowLayout());

		Button b=new Button("我是一个按钮");
		f.add(b);

		//f.addWindowListener(new MyWin());//添加窗体监听器
		
		//可以写成匿名内部类
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.out.println("我关");
				System.exit(0);
			}
			public void windowActivated(WindowEvent e)//窗体被激活(置于前端)
			{
				System.out.println("我活了");
			}
			public void windowOpened(WindowEvent e)//窗体被打开
			{
				System.out.println("我被打开了");
			}
		});
		f.setVisible(true);
	}
}
//因为WindowListener的子类WindowAdapter已经实现了WindowListener接口。
//并覆盖了其中的所有方法。那么我只要继承自Windowadapter覆盖我需要的方法即可。
class MyWin extends WindowAdapter
{
	public void windowClosing(WindowEvent e)
	{
		//System.out.println("window closing---"+e.toString());
		System.exit(0);//事件处理方式
	}
}


Action事件

import java.awt.*;
import java.awt.event.*;
//把事件和图形化界面组件分离开来

class  FrameDemo
{
	//定义该图形中所需的组件的引用
	private Frame f;
	private Button but;
	FrameDemo()
	{
		init();
	}
	public void init()//对图形化界面初始化
	{
		f=new Frame("my frame");

		//对Frame进行基本设置
		f.setBounds(300,100,600,500);//前两个为坐标(距左边、距上边),后两个为宽高,融合了setSize()和setLocation()

		f.setLayout(new FlowLayout());

		but=new Button("my button");

		//将组件添加到Frame中
		f.add(but);

		//加载一下窗体上事件
		myEvent();

		//显示窗体
		f.setVisible(true);
	}
	private void myEvent()
	{
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});

		//让按钮具备退出程序的功能
		/*
		按钮就是事件源
		那么选择哪个监听器呢?
		通过关闭窗体示例了解到,想要知道哪个组件具备什么样的特有监听器
		需要查看该组件对象的功能
		通过查阅button的描述,发现按钮支持一个特有监听addActionListener(活动监听)
		*/

		but.addActionListener(new ActionListener()   //活动监听没有Adapter
		{
			public void actionPerformed(ActionEvent e)
			{
				System.out.println("退出,按钮干的");
				System.exit(0);
			}
		});
	}
	public static void main(String[] args) 
	{
		new FrameDemo();
	}
}


鼠标事件:

but.addMouseListener(new MouseAdapter()  //按钮鼠标监听器
		{
			private int count=1;
			private int clickCount=1;
			public void mouseEntered(MouseEvent e)//------------
			{
				System.out.println("鼠标进入到该组件"+count++);
			}
			public void mouseClicked(MouseEvent e)//----------------
			{
				//System.out.println("点击动作"+clickCount++);
				//鼠标双击动作
				if(e.getClickCount()==2)//点击次数可自己设置
					System.out.println("双击动作"+clickCount++);
			}
		});


键盘事件

but.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e)
			{
				//System.out.println(e.getKeyChar()+"..."+e.getKeyCode());//获取键盘字符和对应的ASCII码值
				//System.out.println(KeyEvent.getKeyText(e.getKeyCode())+"..."+e.getKeyCode());//getKeyText()返回描述keyCode的String

				//if(e.getKeyCode()==27)//ESC对应的Code为27
				//记不住数字,如下表示也可以
				//if(e.getKeyCode()==KeyEvent.VK_ESCAPE)
				//	System.exit(0);

				//组合键
				if(e.isControlDown()&& e.getKeyCode()==KeyEvent.VK_ENTER)//e.isControlDown()判断ctrl键是否按下
					System.out.println("ctrl+enter is run");
			}
		});

对话框Dialog

import java.awt.*;
import java.awt.event.*;
import java.io.*;
class  MyWindowDemo
{
	private Frame f;
	private TextField tf;//文本框,为一行的
	private Button but;
	private TextArea ta;

	private Dialog d;//对话框,发生错误时弹出
	private Label lab;//对话框中有文本
	private Button okBut;//对话框中有按钮

	MyWindowDemo()
	{
		init();
	}

public void init()
	{
		f=new Frame("my window");//my window 显示在Frame上的文字
		f.setBounds(300,100,600,500);
		f.setLayout(new FlowLayout());//流式布局

		tf=new TextField(60);//30列
		but=new Button("转到");//转到  显示在按钮上的文字
		ta=new TextArea(25,70);//文本区域,15行,40列

		d=new Dialog(f,"提示信息-self",true);//f:对话框所有者(Frame,操作Frame弹出的对话框),标题和模式
											//模式为true表示不操作弹出的对话框就不能操作别的

		d.setBounds(400,200,240,150);//设置对话框
		d.setLayout(new FlowLayout());//设置布局
		lab=new Label();
		okBut=new Button("确定");

		d.add(lab);//d本身是一个窗体
		d.add(okBut);

		f.add(tf);//流式布局,注意添加顺序,先添加的在前面,后添加的往后填
		f.add(but);
		f.add(ta);

		myEvent();

		f.setVisible(true);
	}
	private void myEvent()
	{
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);//退出
			}
		});
		but.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				showDir();
			}
		});
		d.addWindowListener(new WindowAdapter()//对话框监听
		{
			public void windowClosing(WindowEvent e)
			{
				d.setVisible(false);//关闭对话框
				//System.exit(0);//此为整个Frame都退出,不合适
			}
		});
		okBut.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				d.setVisible(false);
			}
		});
		tf.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e)
			{
				if(e.getKeyCode()==KeyEvent.VK_ENTER)
					showDir();
			}
		});
	}
		private  void showDir()
		{
			/*
				String text=tf.getText();//获取文本

				ta.setText(text);//把获取到的文本(text)填充到文本区域中

				tf.setText("");

				//System.out.println(text);
				*/

				String dirPath=tf.getText();

				File dir=new File(dirPath);//封装成文件对象才能list

				if(dir.exists() && dir.isDirectory())
				{
					ta.setText("");//清空一次
					String[] names=dir.list();
					for(String name : names)
					{
						ta.append(name+"\r\n");//追加到文本区域末尾
					}
				}
				else
				{
					String info="您输路径:"+dirPath+"是错误的,请重输!";
					lab.setText(info);
					d.setVisible(true);
				}
		}
	public static void main(String[] args) 
	{
		new MyWindowDemo();
	}
}


菜单:

import java.awt.*;
import java.awt.event.*;
//条目MenuItem没有右箭头的,菜单Menu有
class  MyMenuDemo
{
	private Frame f;
	private MenuBar mb;//菜单条
	private Menu m,submenu;  //菜单
	private MenuItem closeItem,subItem;
	MyMenuDemo()
	{
		init();
	}
	public void init()
	{
		f=new Frame("my window");
		f.setBounds(300,100,500,600);
		f.setLayout(new FlowLayout());

		mb=new MenuBar();//菜单条

		m=new Menu("文件");//文件为菜单名

		submenu=new Menu("子菜单");

		closeItem=new MenuItem("退出");//菜单项
		subItem=new MenuItem("子条目");

		//菜单条里可以添加菜单,菜单里可以添加菜单项
		
		submenu.add(subItem);
		m.add(submenu);
		//m.add(subItem);//添加的顺序与排放的顺序一致
		m.add(closeItem);
		mb.add(m);
		f.setMenuBar(mb);//在Frame中设置菜单条

		myEvent();

		f.setVisible(true);
	}
	private void myEvent()
	{
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
		closeItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				System.exit(0);
			}
		});
	}
	public static void main(String[] args) 
	{
		new MyMenuDemo();
	}
}


如何制作可以双击执行的jar包呢?

1、将多个类封装到了一个包(package)

2、定义一个jar包的配置信息。

定义一个文件a.txt 。文件内容内容为:Main-Class:(空格)包名.类名(回车)

3、打jar包。

jar -cvfm my.jar a.txt 包名

4、通过winrar程序进行验证,查看该jar的配置文件中是否有自定义的配置信息

5、通过工具--文件夹选项--文件类型--jar类型文件,通过高级,定义该jar类型文件的打开动作的关联程序。

jdk\bin\javaw.exe -jar

6、双击


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值