GUI

创建图形化界面:
1.创建frame窗体。
2.对窗体基本设置:比如:大小,位置,布局。
3.定义组件。
4.将组件通过窗体的add方法添加到窗体中。
5.让窗体显示,通过setVisible(true)方法。

事件监听机制的特点:
1.事件源。就是awt包或者swing包中的那些图形界面组件。
2.事件。每一个事件源都有自己特有的对应事件和共性事件。
3.监听器。将可以触发某一个事件的动作(不只一个动作)都已经封装到监听器中。

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

4.事件处理。这才是我们需要做的。

<span style="font-family:KaiTi_GB2312;font-size:18px;color:#333333;">import java.awt.*;
import java.awt.event.*;
class AwtDemo
{
	public static void main(String[] args)
	{
		Frame f=new Frame("my awt");//创建窗体,里面组件的默认布局是边界布局
		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)//接收窗口关闭事件
			{
				sop("我关");
				System.exit(0);
			}
			public void windowOpened(WindowEvent e)//窗口被打开
			{
				sop("我被打开了");
			}


			public void windowActivated(WindowEvent e)//窗口被前置
			{
				sop("我活了");
			}
			
		});
		
		
		f.setVisible(true);//设置是否可见






	} 
	/*
	class MyWin implements WindowListener
	{
		//继承此接口需要覆盖7个方法,可是我们只用到了关闭动作。
		//其他动作都没有用到
	}


	因为WindowListener的子类WindowAdapter已经实现了WindowListener接口。
	并覆盖了其中的所有方法,那么我们 只要继承自WindowAdapter覆盖我需要的方法即可
	*/


	
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}


class MyWin extends WindowAdapter//触发器类
{
	public void windowClosing(WindowEvent e)
	{
		System.out.println("window closing"+e.toString());
		System.exit(0);


	}
}</span>




/*上段程序的优化及按钮的Action事件*/
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#333333;">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);//位置和长宽
		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);
				}
			}
			
		);


		//参照窗体事件的过程,写出按钮的事件过程。




		but.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e)//添加对应事件
				{
					sop("按钮干的");
					System.exit(0);
				}
		
		});
	}
	public static void main(String[] args)
	{
		new FrameDemo();
	}
	
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}
</span>



/*GUI-鼠标事件*/
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#333333;">import java.awt.*;
import java.awt.event.*;
class FrameDemo
{
	
	private Frame f;
	private Button but;
	private TextField tf;
	
	FrameDemo()
	{
		init();
	}
	public void init()
	{
		f=new Frame("my frame");
		
		f.setBounds(300,100,600,500);
		f.setLayout(new FlowLayout());
		
		tf=new TextField(10);//初始化带列数
		but=new Button("my button");
	
		f.add(tf);
		f.add(but);


		
		myEvent();


		f.setVisible(true);
	}




	private  void myEvent()
	{
		f.addWindowListener(
		
			new WindowAdapter()
			{


				public void windowClosing(WindowEvent e)
				{
					System.exit(0);
				}
			}
			
		);
		tf.addKeyListener(new KeyAdapter()//只允许文本框添加数字
			{
			public void keyPressed(KeyEvent e)
				{ 
					int code=e.getKeyCode();
					if(!(code>=KeyEvent.VK_0 && code<=KeyEvent.VK_9))
						{sop(code+"...是非法数据");
						e.consume();//该方法使得:不会用默认的处理方式处理这个事件。
						//也就是,原来是让非数字的输入进入到文本框,现在不允许他进入


						}
				}
			
		
			});
		but.addActionListener(new ActionListener()//按钮的活动监听
			
		{
			public void actionPerformed(ActionEvent e)
			{
				sop("action ok");
			}
		
		});
		but.addMouseListener(new MouseAdapter()//在按钮上添加鼠标监听
		{
		
			private int count=1;
			private int clickCount=1;


			public void mouseEntered(MouseEvent e)
			{
				sop("鼠标进入到该组件"+count++);
			}
			public void mouseClicked(MouseEvent e)
			{
					if(e.getClickCount()==2)
					sop("双击动作"+clickCount++);
					
			}
		});
		but.addKeyListener(new KeyAdapter(){//键盘事件
			public void keyPressed(KeyEvent e)
			{
				/*
				KeyText(e.getKeyCode()):根据键的码获得键的符号。
				sop(KeyEvent.getKeyText(e.getKeyCode())+"::"+e.getKeyCode());
				if(e.getKeyCode()==KeyEvent.VK_ENTER)//按下回车键退出
				System.exit(0);	
				*/


				//如果control键被按下,再按回车的组合键,打印。
				if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
				sop("ctrl+enter is run");
					
			
			}
		});
	}


	public static void main(String[] args)
	{
		new FrameDemo();
	}
	
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}
</span>


/*小练习:
文本框输入路径,通过转到按钮,内容显示到文本区域中。
*/
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#333333;">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");
		f.setBounds(300,100,600,500);
		f.setLayout(new FlowLayout());


		tf=new TextField(60);
		but=new Button("转到");
		ta=new TextArea(25,70);//15行40列


		d=new Dialog(f,"提示信息-self",true);//对话框初始化,true模式,不操作对话框就不能操作窗体。
		d.setBounds(400,200,240,150);
		d.setLayout(new FlowLayout());
		lab=new Label();
		okBut=new Button("确定");


		d.add(lab);
		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);
				}
		
			});
		d.addWindowListener(new WindowAdapter()//对话框关闭
			{
				public void windowClosing(WindowEvent e)
				{
					d.setVisible(false);
				}
		
			});
		tf.addKeyListener(new KeyAdapter()
			
		{
			public void keyPressed(KeyEvent e)
			{
				if(e.getKeyCode()==KeyEvent.VK_ENTER)
				{
					showDir();
				}
			}
		
		});//回车充当转到的功能
		
		okBut.addActionListener(new ActionListener()//点击对话框里的ok按钮
				
			{
				public void actionPerformed(ActionEvent e)
				{
					d.setVisible(false);
				}
			});
			


		but.addActionListener(new ActionListener()//转到按钮
				
			{
				public void actionPerformed(ActionEvent e)
				{
					showDir();
				}
			});
	}
			
				
			
	private void showDir()
	{
		String dirPath=tf.getText();
		File dir=new File(dirPath);//将路径封装成文件对象
		if(dir.exists() && dir.isDirectory())
		{
			ta.setText("");//现将文本框原来的内容清掉
			String[] names=dir.list();
			for(String name:names)
			{
				ta.append(name+"\r\n");//将遍历的文件追加到文本区域
			}
		}
					
		//	tf.setText("");
			else
			{
				String info=("你输入的信息"+dirPath+"是错误的,请重新输入");
							
				lab.setText(info);
				d.setVisible(true);
	         }
      }


	public static void sop(Object obj)
	{
		System.out.println(obj);
	}


	public static void main(String[] args)
	{
		new MyWindowDemo();
	}
}</span>


/*GUI-菜单*/

<span style="font-family:KaiTi_GB2312;font-size:18px;color:#333333;">import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class MyMenuDemo
{
	private Frame f;
	private MenuBar mb;//菜单栏
	private Menu m,subMenu;//菜单
	private MenuItem closeItem,subItem,openItem,saveItem;//菜单项
	private FileDialog openDia,saveDia;
	private TextArea ta;


	private File file;
	
	MyMenuDemo()
	{
		init();
	}
	public void init()
	{
		f=new Frame("my windwo");
		f.setBounds(300,100,650,600);
		//f.setLayout(new FlowLayout());//不设置布局,默认为边界布局,让文本区域随着窗口走


		mb=new MenuBar();
		ta=new TextArea();
		m=new Menu("文件");
		subItem=new MenuItem("子条目");
		
		openItem=new MenuItem("打开");
		saveItem=new MenuItem("保存");
		subMenu=new Menu("子菜单");
		closeItem=new MenuItem("退出");




		openDia=new FileDialog(f,"我要打开",FileDialog.LOAD);
		saveDia=new FileDialog(f,"我要保存",FileDialog.SAVE);


		f.setMenuBar(mb);//注意此处是set不是add
		mb.add(m);
		m.add(subMenu);
		subMenu.add(subItem);
		m.add(openItem);
		m.add(saveItem);
		m.add(closeItem);
		
		f.add(ta);
		
		




		myEvent();


		f.setVisible(true);




	}




	private void myEvent()
	{
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		
		});
		openItem.addActionListener(new ActionListener()//打开菜单项
			{
				public void actionPerformed(ActionEvent e)
				{
					openDia.setVisible(true);
					//怎么知道你选的哪个文件?去dialog类找方法。
					String dirPath=openDia.getDirectory();
					String fileName=openDia.getFile();
					sop(dirPath+".."+fileName);
					
					if(dirPath==null||fileName==null)
						return;
					
					ta.setText("");//当选取有效文件时,清空文本区域
					//封装对象
					File file=new File(dirPath,fileName);//据路径名和名字创建一个新 File 实例。


					try
					{
						BufferedReader bufr=new BufferedReader(new FileReader(file));


						String line=null;
						while((line=bufr.readLine())!=null)
						{	
							
							ta.append(line+"\r\n");
						}
					}
					catch (IOException ex)
					{
						throw new RuntimeException("读取失败");
					}


				}
			});
		saveItem.addActionListener(new ActionListener()//保存菜单项
			{
				public void actionPerformed(ActionEvent e)
				{
					if(file==null)//如果文件为空,即还没有创建文件
					{	
						saveDia.setVisible(true);
						String dirPath=saveDia.getDirectory();
						String fileName=saveDia.getFile();
						if(dirPath==null||fileName==null)
							return;
						file=new File(dirPath,fileName);
				     }
					
				 //如果文件已经存在,直接将数据 写入到文件即可
					try
					 {
						BufferedWriter bufw=new BufferedWriter(new FileWriter(file));
						String text=ta.getText();


						bufw.write(text);
						bufw.close();
					 }
					 catch (IOException ey)
					 {
						 throw new RuntimeException("");
					 }
					
				}
			});


		
		closeItem.addActionListener(new ActionListener()//关闭菜单项
			
		{
			public void actionPerformed(ActionEvent e)
			{
				System.exit(0);
			}
		});
	}


	public static void main(String[] args)
	{
		new MyMenuDemo();
	}
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}</span>




将程序做成可执行文件:jar包双击执行
1.在程序内声明包:如:package mymenu;

2.带包编译(指定包存放的路径):javac -d f:\Source2 MyMenuDemo.java

3.新建文本文件写入jar包的配置清单(指定主类):Main-Class: mymenu.MyMenuDemo
注意:此为固定格式:冒号后加空格,包名.类名  回车
3.将包打成jar包:jar -cvfm my.jar 1.txt mymenu
格式: m是包含指定清单(新建文本文件)。
jar -cvfm jar包名.jar  新建文本名.txt  包名(要压缩的包)

在xp下打开jar文件:

话框上部:工具-文件夹选项-文件类型-找到jar类型(也可新建)-高级-
操作:Open
用于执行的程序:浏览-jdk-bin-javaw.exe,然后在后面加上-jar
在win7下打开jar文件:
1.右击jar包,打开方式->选择默认程序->浏览,选中jre下bin文件中javaw.exe
(比如我的javaw.exe在D:\Program Files\Java\jre6\bin下)。

 2、regedit编辑注册表:HKEY_CLASSES_ROOT\Applications\javaw.exe\shell\open\command,
修改数据数值为"D:\Program Files\Java\jdk1.6.0_21\jre\bin\javaw.exe" -jar "%1"(只要在原来的数值下添加-jar即可)




Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐