Java基础:GUI


1.GUI概述

(1).两种常用的用户接口
GUI:Graphical User Interface(图形用户接口),用图形的方式来显示计算机操作的界面,方便直观;
CLI:Command line User Interface(命令行用户接口),需要使用一些命令来完成操作;
(2).java为GUI提供的对象
1).java.AWT:Abstract Window Toolkit,抽象窗口工具包,需要调用系统底层资源来实现功能,属于重量级控件;
2).javax.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,完全用Java来实现,增强了可移植性,属于轻量级控件,对系统依赖性低;
由它开发出来的界面在不同系统下的显示是一致的;
3).SWT:Eclipse开发;
(3).GUI体系基本结构

2.布局管理器

布局:容器中的组件排放方式;
FlowLayout:流式布局,Panel容器的默认布局,从左到右;
BorderLayout:边界式布局,Frame容器的默认布局方式;方位;如果没有指定组件的位置,那么添加的组件会整个填充窗体;
GridLayout:网格布局,规则的矩阵;
GridBagLayout:网格包布局,不规则的矩阵;
GardLayout:卡片式布局,选项卡;
坐标式布局:精确指定组件放置的位置坐标;

3.事件监听机制

(1).事件源(组件):awt或者Swing中的图形界面组件;
(2).事件(Event):每一个事件源都有自己特有的对应事件和共性事件;
(3).监听器(Listener):将可以触发某一事件的动作(不只一个)封装到监听器中;
上述中的项目都在java中定义好了,直接获取对象来使用即可;
(4).事件处理:引发事件后的处理方式;
(5).事件监听机制流程图

4.GUI组件的使用

在组件的使用中,尽量将窗口界面设计和事件处理区分开;

4.1 窗体

java.awt.Frame
(1).构造方法:默认布局是边界式布局;
Frame():构造一个最初不可见的Frame窗口;
Frame(String title):构造一个最初不可见,具有指定标题的Frame窗口;
(2).常用方法:
void addWindowListener(WindowListener l):添加指定的窗口侦听器,以从此窗口接收窗口事件;
接口WidowListener中定义了一些方法,类WidowAdapter以空方法的形式实现了该接口;
在实际使用要传入WindowListener对象时,就创建一个类的对象继承WidowAdapter然后复写具体的事件方法;
void setBounds(int x, int y, int width, int height):设置窗口的位置,大小;
void setSize(int width, int height):设置窗口的大小;
void setLocation(int x, int y):设置窗口的位置;
void setLayout(布局管理器对象):设置布局
void setVisible(boolean b):设置窗口的隐藏和显示;
void add(Object):向窗体中添加其他组件;
(3).窗体示例:
package com.zr.day21;
import java.awt.*;
import java.awt.event.*;
class FrameDemo
{ 
	private Frame f;
	FrameDemo()
	{
		init();
	}
	public void init()
	{
		//创建新的窗体,指定标题
		f = new Frame("我的窗口");
		//设置窗体的位置以及大小
		f.setBounds(300, 200, 600, 400);
		//在窗体上添加窗体事件
		myEvent();
		//设置窗体显示
		f.setVisible(true);
	}
	public void myEvent()
	{
		//给窗体添加事件监听,使其具备关闭窗体的功能;
		f.addWindowListener(new WindowAdapter()
		{
			@Override
			public void windowClosing(WindowEvent e)
			{
				System.out.println("关闭窗口");
				System.exit(0);
			}
		});
	}
}
class GUIFrame
{
	public static void main(String[] args)
	{
		new FrameDemo();
	}
}


4.2 按钮

java.awt.Button:
(1).构造方法:
Button():构造一个标签字符串为空的按钮;
Button(String label):构造一个带指定标签的按钮;
(2).常用方法:
void addActionListener(ActionListener l):添加指定的动作监听,以接收发自此按钮的动作事件;
接口ActionListener中只有一个方法void actionPerformed(ActiionEvent e)需要实现;
String getLabel():获取标签
void setLabel():设置标签
(3).按钮示例:
package com.zr.day21;
import java.awt.*;
import java.awt.event.*;
class FrameDemo
{
	private Frame f;
	private Button b;
	FrameDemo()
	{
		init();
	}
	public void init()
	{
		//设置标题
		f = new Frame("我的窗口");
		//新建一个按钮,指定按钮的文本
		b = new Button("关闭");
		//设置位置和大小
		f.setBounds(200,300,800,600);
		//设置布局模式:默认是边界式布局;现在指定为流式布局;
		f.setLayout(new FlowLayout());
		//添加按钮:在边界式布局下,不指定方位的话,按钮会整个填充窗口;
		f.add(b);
		//添加事件处理
		myEvent();
		//设置窗口显示
		f.setVisible(true);
	}
	public void myEvent()
	{
		//为窗体添加关闭窗口的功能
		f.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e)
			{
				System.out.println("窗口上的关闭");
				System.exit(0);
			}
		});
		//为按钮添加关闭窗口的功能
		b.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e)
			{
				System.out.println("按钮点击关闭");
				System.exit(0);
			}
		});
	}
}
class GUIButton
{
	public static void main(String[] args)
	{
		new FrameDemo();
	}
}


4.3 TextField和TextArea

java.awt.TextField:允许编辑单行文本的文本组件;
(1).构造方法
TextField():构造新文本字段
TextFiled(int columns):指定列数
TextField(String text):指定初始化文本
TextField(String text, int columns):指定初始化文本和列数
(2).常用方法
void addActionListener(ActionListener l):添加指定的操作侦听器
void addTextListener(TextListener l):文本框中的文本变化时调用
接口TextListener中的方法textValueChanged(TextEvent e)
void addKeyListener(KeyListener l):侦听键盘事件
void addMouseListener(MouseListener l):侦听鼠标事件
void setText(String t):将此文本组件显示的文本设置为指定文本;
String getText():返回此文本组件表示的文本
java.awt.TextArea:显示文本的多行区域,可以将其设置为允许编辑或只读;
(1).构造方法
TextArea():
TextArea(int rows, int columns):指定行列
TextArea(String text):指定初始化值
TextArea(String text, int rows, int columns):指定行列和初始化值
TextArea(String text, int rows, int columns, int scrollbars):指定行列,初始化值,以及滚动条的可见性
(2).常用方法
void append(String str):将给定文本追加到文本区的当前文本;
void addTextListener(TextListener l):文本框中的文本变化时调用
接口TextListener中的方法textValueChanged(TextEvent e)
String getText():返回此文本组件表示的文本
void setText(String t):将此文本组件显示的文本设置为指定文本;
void addKeyListener(KeyListener l):侦听键盘事件
void addMouseListener(MouseListener l):侦听鼠标事件
void setVisible(boolean b)

4.4 鼠标和键盘事件

(1).MouseListener接口的实现类:MouseAdapter
 void mouseClicked(MouseEvent e) 
          鼠标按键在组件上单击(按下并释放)时调用。 
 void mouseDragged(MouseEvent e) 
          鼠标按键在组件上按下并拖动时调用。 
 void mouseEntered(MouseEvent e) 
          鼠标进入到组件上时调用。 
 void mouseExited(MouseEvent e) 
          鼠标离开组件时调用。 
 void mouseMoved(MouseEvent e) 
          鼠标光标移动到组件上但无按键按下时调用。 
 void mousePressed(MouseEvent e) 
          鼠标按键在组件上按下时调用。 
 void mouseReleased(MouseEvent e) 
          鼠标按钮在组件上释放时调用。 
 void mouseWheelMoved(MouseWheelEvent e) 
          鼠标滚轮旋转时调用。 
(2).KeyListener接口的实现类:KeyAdapter
 void keyPressed(KeyEvent e) 
          按下某个键时调用此方法。 
 void keyReleased(KeyEvent e) 
          释放某个键时调用此方法。 
 void keyTyped(KeyEvent e) 
          键入某个键时调用此方法。 
(3).配合文本域的使用来演示鼠标和键盘事件;
package com.zr.day21;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class FrameDemo
{
	//全局组件
	private Frame f;
	private Button b;
	private TextField tf;
	private TextArea ta;
	FrameDemo()
	{
		init();
	}
	public void init()
	{
		f = new Frame("我的窗口");
		f.setBounds(300,200,500,500);
		f.setLayout(new FlowLayout());
		b = new Button("转到");
		tf = new TextField(50);
		ta = new TextArea(25,60);
		f.add(tf);
		f.add(b);
		f.add(ta);
		myEvent();
		f.setVisible(true);
	}
	public void showFile()
	{
		ta.setText("");
		String str = tf.getText();
		File file = new File(str);
		if(!(file.exists()&&file.isDirectory()))
			return;
		String[] filenames = file.list();
		for(String filename:filenames)
		{
			ta.append(filename+"\r\n");
		}
		
	}
	public void myEvent()
	{
		
		//窗口关闭动作
		f.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e)
			{
				System.out.println("关闭窗口");
				System.exit(0);
			}
		});
		//在TextField中输入目录,点击回车或者点击按钮时将制定目录下的所有文件名打印;
		b.addMouseListener(new MouseAdapter(){
			@Override
			public void mouseClicked(MouseEvent e)
			{
				showFile();
			}
		});
		tf.addKeyListener(new KeyAdapter(){
			@Override
			public void keyPressed(KeyEvent e)
			{
				if(e.getKeyCode()==KeyEvent.VK_ENTER)
					showFile();
			}
		});
/*		
		//当点击按钮时将TextField中的数据显示在TextArea中;
		b.addMouseListener(new MouseAdapter(){
			@Override
			public void mouseClicked(MouseEvent e)
			{
				ta.setText("");
				String str = tf.getText();
				tf.setText("");
				ta.setText(str);
			}
		});
		//当按下回车键时,将TextField中的数据显示在TextArea中
		tf.addKeyListener(new KeyAdapter(){
			@Override
			public void keyPressed(KeyEvent e)
			{	
				String str = tf.getText();
				if(e.getKeyCode()==KeyEvent.VK_ENTER)
				{
					tf.setText("");
					ta.append(str+"\r\n");
				}
			}
		});
*/
		//按钮键盘事件:组合键
		b.addKeyListener(new KeyAdapter() {
			@Override
            public void keyPressed(KeyEvent e) 
            { 
                //捕获同时按下ctrl+entry 
                if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER) 
                    ta.setText("Ctrl+Enter.....is Down"); 
            } 
        });
	}
}
class GUIMouseAndKey
{
	public static void main(String[] args)
	{
		new FrameDemo();
	}
}


4.5 对话框

对话框在需要时才会创建该对象;
比如在列出目录下的文件列表中,当输入的文件不存在时,应该以对话框的形式给出错误提示信息;
(1).构造方法:需要制定所有者,可以指定标题
Dialog(Dialog owner) 
          构造一个最初不可见的、无模式的 Dialog,它带有指定所有者 Dialog 和一个空标题。 
Dialog(Dialog owner, String title) 
          构造一个最初不可见的、无模式的 Dialog,它带有指定的所有者 Dialog 和标题。 
Dialog(Frame owner) 
          构造一个最初不可见的、无模式的 Dialog,它带有指定所有者 Frame 和一个空标题。 
Dialog(Frame owner, String title) 
          构造一个最初不可见的、无模式的 Dialog,它带有指定的所有者 Frame 和标题。  
Dialog(Window owner) 
          构造一个最初不可见的、无模式的 Dialog,它带有指定所有者 Window 和一个空标题。  
Dialog(Window owner, String title) 
          构造一个最初不可见的、无模式的 Dialog,它带有指定的所有者 Window 和标题。 
另外还有模式的属性:当模式属性为true时,无法操作其他的船体;
(2).常用方法:对话框也是一个容器所以可以再对话框中添加一些组件;
void setVisible(boolean b)
(3).对话框示例:对目录文件列表的优化;
//列出指定目录下的文件名称;
//输入的目录不合法时,以对话框的形式显示错误信息;
//
package com.zr.day21;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class FrameDemo
{
	//全局组件
	private Frame f;
	private Button b;
	private TextField tf;
	private TextArea ta;
	private Dialog d;
	private Label l;
	private Button ok;
	FrameDemo()
	{
		init();
	}
	public void init()
	{
		f = new Frame("我的窗口");
		f.setBounds(300,200,500,500);
		f.setLayout(new FlowLayout());
		b = new Button("转到");
		tf = new TextField(50);
		ta = new TextArea(25,60);
		f.add(tf);
		f.add(b);
		f.add(ta);
		myEvent();
		f.setVisible(true);
	}
	public void showFile()
	{
		String str = tf.getText();
		File file = new File(str);
		if(file.exists())
		{
			//输入的是目录则打印目录中的文件名称
			ta.setText("");
			if(file.isDirectory())
			{
				String[] fileNames = file.list();
				for(String fileName:fileNames)
				{
					ta.append(fileName+"\r\n");
				}
			}
			//输入的是文件则打印文件本身的名称
			else
			{
				ta.setText(str);
			}
		}
		//输入的目录不存在或者不合法,以对话框的形式提示错误信息
		else
		{
			//新建一个对话框,指定它的所属,指定它的标题,指定模式
			d = new Dialog(f,"Wrong Message",true);
			//设置位置大小
			d.setBounds(400,200,280,150);
			//添加文本
			l = new Label();
			//添加按钮
			ok = new Button("确定");
			//设置流式布局
			d.setLayout(new FlowLayout());
			//按钮的活动事件监听
			ok.addActionListener(new ActionListener(){
				@Override
				public void actionPerformed(ActionEvent e) 
				{
					d.setVisible(false);
				}
			});
			//窗体的关闭事件监听
			d.addWindowListener(new WindowAdapter(){
				@Override
				public void windowClosing(WindowEvent e)
				{
					d.setVisible(false);
				}
			});
			d.add(l);
			d.add(ok);
			l.setText("您输入的路径"+str+"不合法,请重新输入!");
			d.setVisible(true);
		}
	}
	public void myEvent()
	{
		b.addMouseListener(new MouseAdapter(){
			@Override
			public void mouseClicked(MouseEvent e)
			{
				showFile();
			}
		});
		tf.addKeyListener(new KeyAdapter(){
			@Override
			public void keyPressed(KeyEvent e)
			{
				if(e.getKeyCode()==KeyEvent.VK_ENTER)
					showFile();
			}
		});
		f.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
	}
}
class GUIDialog
{
	public static void main(String[] args)
	{
		new FrameDemo();
	}
}

4.6 菜单

(1).MenuBar:
构造方法:MenuBar()
常用方法:
Menu add(Menu m):将指定的菜单添加到菜单栏;
窗体中通过setMenuBar()来添加菜单栏;
(2).Menu
构造方法:
Menu():空标签,使用setlabel(String label)添加标签;
Menu(String label):带有指定的标签
常用方法:
MenuItem add(MenuItem mi):可以再菜单中添加子菜单或者菜单项;
(3).MenuItem
构造方法:
MenuItem():空标签,使用setlabel(String label)添加标签;
MenuItem(String label):带有指定的标签
MenuItem时Menu的父类,它们都可以事件监听,addActionListener()
(4).菜单栏,菜单项,菜单示例
代码设计:
//菜单栏示例
package com.zr.day21;
import java.awt.*;
import java.awt.event.*;
class GUIMenu
{
	public static void main(String[] args)
	{
		Frame f = new Frame("我的窗口");
		f.setBounds(300,200,500,500);
		MenuBar mb = new MenuBar();
		Menu m1 = new Menu("文件");
		Menu m2 = new Menu("其他");
		Menu m3 = new Menu("子菜单");
		MenuItem mi1 = new MenuItem("打开");
		MenuItem mi2 = new MenuItem("保存");
		MenuItem mi3 = new MenuItem("退出");
		MenuItem mi4 = new MenuItem("A");
		MenuItem mi5 = new MenuItem("B");
		MenuItem mi6 = new MenuItem("C");
		
		m3.add(mi4);
		m3.add(mi5);
		m3.add(mi6);
		
		m1.add(mi1);
		m1.add(mi2);
		m1.add(mi3);
		m1.add(m3);
		
		mb.add(m1);
		mb.add(m2);
		f.setMenuBar(mb);
		mi3.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e)
			{
				System.exit(0);
			}
			
		});
		f.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
		f.setVisible(true);
	}
}
运行效果:



4.7 记事本

制作简易的记事本,实现其保存文件盒打开文件的功能;
FileDialog:显示一个对话框窗口,用户可以从中选择文件;
(1).构造方法:
FileDialog(Frame parent):创建一个文件对话框,用于加载文件。 
FileDialog(Frame parent, String title):创建一个具有指定标题的文件对话框窗口,用于加载文件。 
FileDialog(Frame parent, String title, int mode): 创建一个具有指定标题的文件对话框窗口,用于加载或保存文件。
其中模式mode:int LOAD用于打开,int SAVE用于保存;
(2).常用方法:
String getDirectory():获取此文件对话框的目录;
String getFile():获取此文件对话框选定的文件;
(3).记事本程序:
package com.zr.day21;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
//窗体中包含的组件:菜单栏(包括其中的菜单和菜单项),文件对话框;
class FrameDemo
{
	private Frame f;
	private MenuBar mb;
	//文件菜单
	private Menu file_function;
	//其他菜单
	private Menu other;
	//打开
	private MenuItem open_file;
	//保存
	private MenuItem save_file;
	//另存为
	private MenuItem saveother_file;
	//退出
	private MenuItem exit_item;
	private FileDialog openDia, saveDia;
	//文本域
	private TextArea ta;
	private File file;
	FrameDemo()
	{
		init();
	}
	public void init()
	{
		f = new Frame("记事本窗口");
		f.setBounds(300, 200, 600, 400);
		ta = new TextArea();
		f.add(ta);
		mb = new MenuBar();
		file_function = new Menu("文件");
		other = new Menu("其他");
		open_file = new MenuItem("打开");
		save_file = new MenuItem("保存");
		saveother_file = new MenuItem("另存为...");
		exit_item = new MenuItem("退出");
		openDia = new FileDialog(f,"打开文件",FileDialog.LOAD);
		saveDia = new FileDialog(f,"保存文件",FileDialog.SAVE);
		f.setMenuBar(mb);
		mb.add(file_function);
		mb.add(other);
		file_function.add(open_file);
		file_function.add(save_file);
		file_function.add(saveother_file);
		file_function.add(exit_item);
		myEvent();
		f.setVisible(true);
	}
	public void myEvent()
	{
		//打开文件
		open_file.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e)
			{
				//显示文件打开对话框
				openDia.setVisible(true);
				//获取路径
				String dirname = openDia.getDirectory();
				//获取文件名
				String filename = openDia.getFile();
				if(dirname==null||filename==null)
					return;
				try
				{
					//利用路径和文件创建文件对象
					file = new File(dirname,filename);
					//清空文本域
					ta.setText("");
					//创建文件读取流
					BufferedReader br = new BufferedReader(new FileReader(file));
					//通过文件读取流读取数据显示在文本域
					for(String line = null; (line=br.readLine())!=null;)
					{
						ta.append(line+"\r\n");
					}
					//关闭流资源
					br.close();
				}
				catch(Exception ex)
				{
					throw new RuntimeException("打开文件失败");
				}		
			}	
		});
		save_file.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e)
			{
				//如果是第一次保存,则显示文件对话框  
                if(file==null)
                {  
                    //显示文件保存对话框  
                    saveDia.setVisible(true);  
                    String dirname=saveDia.getDirectory();  
                    String filename=saveDia.getFile();  
                      
                    if(dirname==null||filename==null)  
                        return;  
  
                    file = new File(dirname,filename);   
                }
                try
                {
                	//创建文件输出流,关联文件
                	BufferedWriter bw = new BufferedWriter(new FileWriter(file));
    				String filetext = ta.getText();
    				bw.write(filetext);
    				bw.close();	
                }
                catch(Exception ex)
                {
                	throw new RuntimeException("文件保存失败");
                }
			}	
		});
		saveother_file.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) 
			{
				//另存为总会弹出文件保存对话框
				saveDia.setVisible(true);
				String dirname = saveDia.getDirectory();
				String filename = saveDia.getFile();
				if(dirname==null||filename==null)
					return;
				try
				{
					file = new File(dirname,filename);
					BufferedWriter bw = new BufferedWriter(new FileWriter(file));
					String filetext = ta.getText();
					bw.write(filetext);
					saveDia.setFile(filename);
					bw.close();
				}
				catch(Exception ex)
				{
					throw new RuntimeException("文件保存失败");
				}
			}
		});
		//窗体退出的操作
		f.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
		//菜单项退出的操作
		exit_item.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) 
			{
				System.exit(0);
			}
		});
	}
}
class GUINote
{
	public static void main(String[] args)
	{
		new FrameDemo();
	}
}


4.8 JAR文件

既然是图形化界面,就需要通过图形化界面的形式运行程序,而不是是用Dos命令行执行,那么如何通过双击程序就执行程序呢?这就需要将程序的class文件打包。
步骤如下:
1).首先要在java文件中导入一个包,没有则需创建一个包,如package mymenu;
2).生成包:通过编译javac -d c:\myclass MyMenu.java,此时则在c盘下的myclass文件夹下生成了所有的.class文件
3).在此目录下新建一个文件,如1.txt或者其他任意名称任意扩展名的文件都可,然后在其中编辑固定的格式:“Main-Class: mymenu.MenuDemo”,只写引号中的内容。需要需要在冒号后有一个空格,在文件末尾要回车。
4).编译:jar -cvfm my.jar 1.txt mymenu即可。如果想添加其他信息,则直接编译jar即可得出相应的命令
5).此时双击即可执行。
说明:
1).在固定格式中:
a、如果无空格:在编译的时候,就会报IO异常,提示无效的头字段,即invalidheader field。这说明1.txt在被IO流读取。
b、如果无回车:在列表清单.MF中不会加入相应的加载主类的信息,也就是说配置清单的属性主类名称不会加载进清单中,也就不会执行。
2).jar文件必须在系统中注册,才能运行。注册方法如下:
A.对于XP系统:
a.打开任意对话框,在菜单栏点击工具按钮,选择文件夹选项
b.选择新建--->扩展名,将扩展名设置为jar,确定
c.选择高级,可更改图标,然后点击新建,命名为open,
d.在用于可执行应用程序中,点浏览,将jdk下的bin的整个文件路径添加进来,并在路径后添加-jar即可。
B.对于win7系统:
a.改变打开方式:右击.jar文件,点击打开方式,选择默认程序为jdk下bin中的javaw.exe应用程序。
b.修改关联程序的注册表:打开注册表(win+r),找到注册表路径\HKEY_CLASSES_ROOT\Aplications\javaw.exe\shell\open\command下的字符串值,右击点修改,在原路径的中添加-jar,如:"C:\ProgramFiles\Java\jre6\bin\javaw.exe" -jar "%1",注意-jar两边要有空格,保存。
c.双击即可执行jar程序,如果仍不能执行,则需下载最新版的jdk。
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值