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);
			}
		}
	}

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章