Java基础19-GUI

一.GUI
 1.名词解释
  事件:   用户对组件的一个操作就是一个事件
  事件源: 发生事件的组件
  监听器: 添加在事件源上的对象, 这个对象中包含了对事件处理的方法


 2.监听器使用方式
  定义类实现XxxListener接口, 实现接口中所有方法. 创建对象, 添加在事件源上.
  定义类继承XxxAdapter, 重写需要的方法. 创建对象, 添加在事件源上.


  Adapter原理:
   Adapter是实现了Listener接口的抽象类, 该类中将接口内的所有方法的实现了, 但是方法中没写任何代码.
   就是为了给定义监听器时提供方便, 只需要重写必须的方法就可以了.

 

二.练习

1.简易Notepad

package cn.base22.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.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
/*
 * 简易的文本工具
 */
public class MyNotepad {

	private Frame frame;
	private MenuBar menuBar;
	private Menu fileMenu;
	private Menu editMenu;
	private MenuItem openMenuItem;
	private MenuItem saveMenuItem;
	private MenuItem exitMenuItem;
	private TextArea textArea;
	
	private MyNotepad() {
		initUI();
		handleEvent();
	}
	
	private void initUI() {
		frame = new Frame();
		frame.setTitle("MyNotepad");
		frame.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - 600)/2
				, (Toolkit.getDefaultToolkit().getScreenSize().height - 500)/2);
		frame.setSize(600, 500);
		
		menuBar = new MenuBar();
		fileMenu = new Menu("文件");
		editMenu = new Menu("编辑");
		openMenuItem = new MenuItem("打开(O) Ctrl+O");
		saveMenuItem = new MenuItem("保存(S) Ctrl+S");
		exitMenuItem = new MenuItem("退出");
		textArea = new TextArea();
		
		frame.setMenuBar(menuBar);
		frame.add(textArea);
		menuBar.add(fileMenu);
		menuBar.add(editMenu);
		fileMenu.add(openMenuItem);
		fileMenu.add(saveMenuItem);
		fileMenu.addSeparator();
		fileMenu.add(exitMenuItem);
		
		frame.setVisible(true);		
	}
	
	private void handleEvent() {
		frame.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		
		openMenuItem.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				open();
			}			
		});
		
		saveMenuItem.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				save();
			}			
		});
		
		exitMenuItem.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}		
		});
		
		textArea.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_O) {
					open();
				} else if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_S) {
					save();
				}
			}
		});
		
	}
	
	private void save() {
		FileDialog dialog = new FileDialog(frame, "保存", FileDialog.SAVE);
		dialog.setVisible(true);											//需注意
		
		String dirPath = dialog.getDirectory();
		String fileName = dialog.getFile();
		
		if(dirPath!= null && fileName!= null) {								//需注意
			File file = new File(dirPath, fileName);
			saveFile(file);
		}
	}
	
	private void saveFile(File file) {
		FileWriter fos=null;
		
		try {
			fos = new FileWriter(file);
			fos.write(textArea.getText());
		} catch (IOException e) {
			throw new RuntimeException("系统出错了!-_-");
		} finally {
			try {
				if(fos != null)
					fos.close();
			} catch (IOException e) {
				throw new RuntimeException("系统出错了!-_-");
			}
		}
		
	}
	
	private void open() {
		FileDialog dialog = new FileDialog(frame, "打开", FileDialog.LOAD);
		dialog.setVisible(true);											//需注意
		
		String dirPath = dialog.getDirectory();
		String fileName = dialog.getFile();
		
		if(dirPath!= null && fileName!= null) {								//需注意
			File file = new File(dirPath, fileName);
			loadFile(file);
		}
	}
	
	private void loadFile(File file) {
		FileInputStream fis = null;
		ByteArrayOutputStream bos = null;
		
		try {
			fis = new FileInputStream(file);
			bos = new ByteArrayOutputStream();
			byte[] b = new byte[1024];
			int len = 0;
			while((len=fis.read(b))!=-1) {
				bos.write(b, 0, len);
			}
			String context = bos.toString();
			textArea.setText(context);
			
		} catch (FileNotFoundException e) {
			throw new RuntimeException("请注意: 文件不存在!");
		} catch (IOException e) {
			throw new RuntimeException("系统出错了!-_-");
		} finally {
			try {
				if(fis != null)
					fis.close();
			} catch (IOException e) {
				throw new RuntimeException("系统出错了!-_-");
			}
		}
		
	}
	
	public static void main(String[] args) {
		new MyNotepad();
		
	}
}

 

2.文件浏览器

package cn.base22.gui;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.Label;
import java.awt.List;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;

/*
 * 文件浏览器
 */
public class MyExplorer {

	private Frame frame;
	private Panel panel;
	private Label label;
	private TextField textField;
	private Button turnTo;
	private Button turnUp;
	private List list;

	public static void main(String[] args) {
		new MyExplorer();
	}
	
	private MyExplorer() {
		generateUI();
		handleEvent();
	}
	
	private void generateUI() {
		frame = new Frame("MyExplorer");
		frame.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width-600)/2
				,(Toolkit.getDefaultToolkit().getScreenSize().height-500)/2);
		frame.setSize(600, 500);
		
		panel = new Panel();
		label = new Label("文件路径为: ");
		textField = new TextField(30);
		turnTo = new Button("转到");
		turnUp = new Button("返回");	
		
		panel.add(label);
		panel.add(textField);
		panel.add(turnTo);
		panel.add(turnUp);
		
		list = new List();
		
		frame.add(panel, BorderLayout.NORTH);
		frame.add(list, BorderLayout.CENTER);		
		
		frame.setVisible(true);
	}

	private void handleEvent() {
		frame.addWindowListener(new WindowAdapter() {		//关闭窗口
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		
		turnTo.addActionListener(new ActionListener() {		//点击按钮打开文件
			@Override
			public void actionPerformed(ActionEvent e) {
				turnTo();
			}
		});
		
		turnUp.addActionListener(new ActionListener() {		//点击按钮返回上级目录
			@Override
			public void actionPerformed(ActionEvent e) {
				turnUp();
			}
		});
		
		list.addActionListener(new ActionListener() {		//鼠标双击list的子项打开文件
			@Override
			public void actionPerformed(ActionEvent e) {
				clickList();				
			}
		});
		
		textField.addKeyListener(new KeyAdapter() {			//在textField中按回车键,打开文件
			@Override
			public void keyPressed(KeyEvent e) {
				if(e.getKeyCode()==KeyEvent.VK_ENTER) {
					turnTo();
				}
			}
		});
	}
	
	protected void turnUp() {										   //返回上级目录,若到达根目录,则不变化
		File file = new File(textField.getText());
		String parentPath = file.getParent();
		
		if(parentPath != null) {		
			textField.setText(parentPath);
			list.removeAll();
			file = new File(parentPath);
			String[] files = file.list();			
			for(String name : files) {
				list.add(name);
			}					
		} 
	}

	private void turnTo() {												//点击按钮打开文件
		File file = new File(textField.getText() + File.separator); 
		listFile(file);			
	}
	
	protected void clickList() {										//鼠标双击打开文件
		File file = new File(textField.getText(), list.getSelectedItem().toString()); 		
		listFile(file);
	}

	private void listFile(File file) {
		if(file.isDirectory()) {						//如果是路径,则清空list,修改textField内容,进行遍历输出,添加到list		
			textField.setText(file.getAbsolutePath());
			list.removeAll();
			
			String[] files = file.list();
			for(String name : files) {
				list.add(name);
			}
			
		} else if(file.isFile()) {						//如果是文件,则直接打开
			try {
				Runtime.getRuntime().exec("cmd /c \"" + file.getAbsolutePath() + "\"");
			} catch (IOException e) {
				throw new RuntimeException(e);
			}
		}
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值