JavaGUI

GUI--Graphical User Interface(图形用户接口)
CLI--Command Line Interface(命令行用户接口)
Java为GUI提供的对象都存在java.awt和javax.swing。
java.awt:Abstract Window ToolKit(抽象窗口工具包),需要调用本地系统方法实现功能。属于重量级控件。由这个包开发的软件,在不同系统呈现的外观有所不同。
java.swing:在awt的基础上,建立了一套图形界面系统,其中提供了更多的组件,而且完全由java实现,增强了移植性,属轻量级控件。由这个包开发的软件,在任何系统呈现的外观都一样。
eclipse工具本身是纯java编写的,它使用的是swt外观包,这个外观包也是基于awt的,这是eclipse开发小组自己做的外观包,可以去eclipse官网下载。

常用GUI组件继承关系图:其中比较特殊的是Container,是一个可包含其他 AWT 组件的组件。


布局管理器:

事件监听机制:
1,事件源-----就是awt包或swing包中的那些图形界面组件。
2,事件-----每一个事件源都有自己特有的对应事件和共性事件。
3,监听器-----将可以触发的某一个事件的动作(不止一个动作)都已经封装到了监听器中。
4,事件处理-----以上三者,在java中都已经定义好了。直接获取其对象来用就可以了。我们要做的事情就是对产生的动作进行处理。

事件监听机制流程图:

一,窗体事件--使窗体的关闭按钮起作用

package GUI;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
 * 窗体事件的运用--addWindowListener(WindowAdapter w)
 */
public class AwtDemo {

	/**
	 * 创建图形化界面基本步骤:
	 * 1,创建frame窗体
	 * 2,对窗体进行基本设置
	 *    比如,大小、颜色、位置、布局等
	 * 3,定义组件,
	 * 4,将组件通过窗体的add方法添加到窗体中
	 * 5,通过setVisible(true)让窗体显示
	 */
	public static void main(String[] args) {
		//Frame默认是边界布局管理器
		Frame f = new Frame("my awt");
		f.setSize(500, 400);//设置大小
		f.setLocation(300, 100);
		f.setLayout(new FlowLayout());
		
		Button b = new Button("我是一个按钮");
		f.add(b);
		
		//addWindowListener方法的参数是一个WindowListener接口,
		//因为WindowListener的子类WindowAdapter已经实现了WindowListener接口,
		//并覆盖了其中的所有方法,那么我们只要继承自WindowAdapter,覆盖自己需要的方法即可。
		f.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
			@Override
			public void windowOpened(WindowEvent e) {
				System.out.println("windowOpened");
			}
			@Override
			public void windowActivated(WindowEvent e) {
				System.out.println("windowActivated");
			}
		});
		
		f.setVisible(true);//必须调用setVisible方法使显示
		

	}

}

 

 

二,Action事件

package GUI;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
 * Action事件--addActionListener(ActionListener a)
 * 只有一个方法需要实现,没有对应的适配器,这是比较特殊的一点。大部分Listener都有对应的是适配器,只要接口里的方法超过3个的都有对应的是适配器。
 */
public class FrameDemo {
	private  Frame f;
	private Button b;
	FrameDemo(){
		init();
	}
	public void init(){
		f=new Frame("My frame");
		f.setBounds(300, 200, 500, 400);
		f.setLayout(new FlowLayout());
		//将组件添加到frame中
		b=new Button("My button");
		
		f.add(b);
		//加载窗体上事件
		myEvent();
		//显示窗体
		f.setVisible(true);
	}

	private void myEvent(){
		f.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		//让按钮具备退出程序的功能
		/**
		 * 按钮就是事件源,那么选择哪个监听器呢?
		 * 通过关闭窗体示例了解到,想要知道哪个组件具备什么样的特有监听器,
		 * 需要查看该组件对象的功能。
		 * 通过查阅API中button的描述,发现按钮支持一个特有监听addActionListener(ActionListener e)
		 * 
		 * 注意:ActionListener是一个接口,并且没有对应的适配器,
		 *      大部分Listener都有对应的是适配器,只要接口里的方法超过3个的都有对应的是适配器
		 */
		b.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				System.out.println("按钮退出");
				System.exit(0);
			}
			
		});
	}
	public static void main(String[] args) {
		new FrameDemo();

	}

}


三,鼠标事件,键盘事件

实现按ESC键退出,按组合键CTRL+ENTER退出,双击鼠标操作的代码。

package GUI;

import java.awt.*;
import java.awt.event.*;
//鼠标事件,键盘事件
public class MouseAndKeyEvent {

	private  Frame f;
	private Button b;
	private TextField tf;
	MouseAndKeyEvent(){
		init();
	}
	public void init(){
		f=new Frame("My frame");
		f.setBounds(300, 200, 500, 400);
		f.setLayout(new FlowLayout());
		//将组件添加到frame中
		b=new Button("My button");
		tf = new TextField(10);//10列的文本框

		f.add(tf);
		f.add(b);
		//加载窗体上事件
		myEvent();
		//显示窗体
		f.setVisible(true);
	}

	private void myEvent(){
		//窗体事件
		f.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		//鼠标事件
		b.addMouseListener(new MouseAdapter(){
			private int count=1;
			private int clickcount = 1;
			@Override
			public void mouseEntered(MouseEvent e) {
				System.out.println("鼠标进入该组件:"+ count++);
			}
			@Override
			public void mouseClicked(MouseEvent e) {
				//双击鼠标
				if(e.getClickCount()==2){
					System.out.println("鼠标双击:"+ clickcount++);
				}
			}
		});
		//按钮上加事件最好加ActionEvent
		b.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				System.out.println("活动");
			}
		});
		//键盘事件
		b.addKeyListener(new KeyAdapter(){
			@Override
			public void keyPressed(KeyEvent e) {
				System.out.println(e.getKeyCode()+"..."+e.getKeyText(e.getKeyCode()));
				//按ESC键退出
				if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
					System.exit(0);
				}
				//按组合键CTRL+ENTER退出
				if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER){
					System.exit(0);
				}
			}
		});
		tf.addKeyListener(new KeyAdapter(){
			@Override
			public void keyPressed(KeyEvent e) {//注意这里如果是keyReleaseed事件的话,那么e.consume()是不管用的
				int code = e.getKeyCode();
				if(!(code>=KeyEvent.VK_0&&code<=KeyEvent.VK_9)){
					System.out.println(code+"非法");
					e.consume();//这行代码保证非法字符不会写入文本框
				}
			}
/*			@Override
			public void keyReleased(KeyEvent e) {//如果是keyReleased事件的话,写了e.consume(),非法字符也会输入到文本框
				int code = e.getKeyCode();
				if(!(code>=KeyEvent.VK_0&&code<=KeyEvent.VK_9)){
					System.out.println(code+"非法");
					e.consume();//这行代码保证非法字符不会写入文本框
				}
			}*/
		});
	}
	public static void main(String[] args) {
		new MouseAndKeyEvent();

	}

}


四,文本框,文本域,对话框的使用

点击按钮,把第一个文本框输入的路径下的文件目录,显示到另外一个文本框中。如果第一个文本框输入的非法路径,显示提示框。

实现文本框中按回车,和点击按钮一个效果。提示框(对话框)的运用。

package GUI;

import java.awt.*;
import java.awt.event.*;
import java.io.File;
//文本框,文本域,对话框
public class MyWindowDemo{

	private Frame f;
	private TextField tf;
	private Button b;
	private TextArea ta;
	
	MyWindowDemo(){
		init();
	}
	public void init(){
		f=new Frame("My window");
		f.setBounds(300,200,500,400);
		f.setLayout(new FlowLayout());
		
		tf=new TextField(55);
		b=new Button("转到");
		ta=new TextArea(25,65);
		
		f.add(tf);
		f.add(b);
		f.add(ta);
		myEvent();
		f.setVisible(true);
	}
	private void myEvent() {
		f.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		//实现文本框中按回车,和点击按钮一个效果
		tf.addKeyListener(new KeyAdapter(){
			@Override
			public void keyPressed(KeyEvent e) {
				if(e.getKeyCode()==KeyEvent.VK_ENTER){
					showDir();
				}
			}
		});
		b.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");
			}
		}else{
			String message = "您输入的信息:"+dirPath+",不存在,请重输!";
			final Dialog d = new Dialog(f,"提示信息",true);
			Label lb=new Label(message);
			Button okBut = new Button("确定");
			
			d.add(lb);
			d.add(okBut);
			
			d.setBounds(400, 200, 240, 150);
			d.setLayout(new FlowLayout());
			//对框框添加监听器
			d.addWindowListener(new WindowAdapter(){
				@Override
				public void windowClosing(WindowEvent e) {
					d.setVisible(false);
				}
			});
			//对话框上的按钮添加监听器
			okBut.addActionListener(new ActionListener(){

				public void actionPerformed(ActionEvent e) {
					d.setVisible(false);
				}
				
			});
			//回车键起作用
			okBut.addKeyListener(new KeyAdapter(){
				@Override
				public void keyPressed(KeyEvent e) {
					if(e.getKeyCode()==KeyEvent.VK_ENTER){
						d.setVisible(false);
					}
				}
			});
			
			d.setVisible(true);
		}
		tf.setText("");
	}
	public static void main(String[] args) {
		new MyWindowDemo();

	}

}


五,实现简单的记事本功能--运用到了打开文件对话框、保存文件对话框,还有菜单的使用。

menu是menuItem的子类,menu有一个add()方法参数是MenuItem,所以menu可以添加menuItem,也可以添加menu。要想有子菜单的话,那么,menu需要添加menu,然后再在menu上添加menuItem。

package GUI;

import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class MyMenuDemo {

	/**
	 * 菜单:实现简单的记事本功能
	 */
	private Frame f;
	private MenuBar mb;
	private Menu m,subMenu;
	private MenuItem openItem,saveItem,closeItem,subItem;
	private TextArea ta;
	private File file;
	MyMenuDemo(){
		init();
	}
	
	public void init(){
		f=new Frame("My Note");
		f.setBounds(300,100,500,400);
//		f.setLayout(new FlowLayout());
		
		mb=new MenuBar();
		m=new Menu("File");
		subMenu=new Menu("subMenu");
		openItem = new MenuItem("open");
		saveItem = new MenuItem("save");
		closeItem=new MenuItem("exit");
		subItem = new MenuItem("subItem");
		
		ta=new TextArea();
		
		subMenu.add(subItem);
		m.add(openItem);
		m.add(saveItem);
		m.add(subMenu);//menu添加menu,menu是menuItem的子类
		m.add(closeItem);//menu添加menuItem
		mb.add(m);
		f.setMenuBar(mb);//往frame里添加菜单条使用setMenuBar方法,而不是add方法
		f.add(ta);//在菜单条下面添加一个文本框
		
		myEvent();
		f.setVisible(true);
		
	}
	private void myEvent() {
		f.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		//打开对话框
		openItem.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				FileDialog openDialog = new FileDialog(f,"open",FileDialog.LOAD); 
				openDialog.setVisible(true);
				String filePath = openDialog.getDirectory();
				String fileName = openDialog.getFile();
				//获取目录或文件失败的处理
				if(filePath==null||fileName==null)
					return;
				f.setTitle(f.getTitle()+"^o^"+filePath+fileName);
				ta.setText("");
//				File file =new File(filePath,fileName);
				file =new File(filePath,fileName);
				BufferedReader br;
				try {
					br = new BufferedReader(new FileReader(file));
					String line = null;
					while((line=br.readLine())!=null){
						ta.append(line+"\r\n");
					}
					br.close();
				} catch (IOException e1) {
					throw new RuntimeException("读取失败");
				}
			}
			
		});
		//保存对话框,要考虑是否弹出
		saveItem.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				if(file==null){
					FileDialog saveDialog = new FileDialog(f,"save",FileDialog.SAVE); 
					saveDialog.setVisible(true);
	
					String filePath = saveDialog.getDirectory();
					String fileName = saveDialog.getFile();
					//获取目录或文件失败的处理
					if(filePath==null||fileName==null)
						return;
					f.setTitle(f.getTitle()+"^o^"+filePath+fileName);
					file =new File(filePath,fileName);
				}
				try {
					BufferedWriter bw = new BufferedWriter(new FileWriter(file));
					String content = ta.getText();
					bw.write(content);
					bw.close();
				} catch (IOException e1) {
					throw new RuntimeException("写入失败");
				}
			}
			
		});
		//菜单项退出系统
		closeItem.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
			
		});
	}
	public static void main(String[] args) {
		
		new MyMenuDemo();
	}

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值