java 自学日志【十五】---GUI

GUI:
Graphical User Interface(图形用户接口),用图形的方式,来显示计算机操作的界面,这样更方便直观。
还有另一种CLI:
CLI:Command line User Interface(命令行用户接口),也就是常见的dos窗口,它需要记住一些常用的命令,操作不直观方便。
这两种交互方式就是常说的:命令行界面和图形化界面。

Java为GUI提供的对象都在java.awt和javax.swing这两个包中。
Awt和Swing
java.awt:abstractWindow ToolKit(抽象窗口工具集,需要调用本地系统方法实现功能,属于重量级控件。
javax.swing:在AWT的基础上,建立的一套图形界面系统,其中提供更多的组件,而且完全由java实现,增强了移植性,属于轻量级控件。
小知识点:这里的“重量级”是指跟平台结合紧密,轻量级与之相反。


container:是一个容器,是一个特殊的组件(component),它可以添加其他组件进来;

frame:是windows的子类,它启动时,要通过setvisible(true)的方法来启动窗口,GUI中,启动一个窗口就是启动一个前台线程,虽然主函数运行完了,但前台线程没结束,所以程序也就不会结束。

窗口的布局管理器:容器中的组件排列方式,就是布局。
常见的布局方式有:
① FlowLayout: 流式布局,从左到右顺序排列,它是panel(面板)的默认布局方式;
②BorderLayout: 边界布局,按照东南西北中的方式排序,frame的默认布局方式;
③ GridLayout:网格布局,规则的矩阵;
④ CardLayout:卡片布局,选项卡;
⑤ GridbagLayout: 网格包布局,非规则的矩阵;
⑥ 坐标式布局: 可以任意添加组件位置;

事件监听机制:

事件监听机制由四部分组成:事件源(组件)、事件(Event)、监听器(Listener)和事件处理(引发事件后的处理方式)。

1.事件源:就是java.awtjavax.swing包中的GUI组件。

2.事件:每个事件源都有自己的特有事件和共性事件(鼠标事件和键盘事件即是它们的共性事件)。

3.监听器:将可以触发某一事件的动作(不止一个)都封装在了监听器中。
4.事件处理:事件源、事件和监听器在java中已经定义好了,直接获取其对象来用就可以了,我们要做的是对产生的动作进行处理。


窗体事件
WindowEvent事件对于的是WindowListener,事件对象作为参数,传入监听器的处理事件方法中。
WindowListener,是一个接口,对应的Window组件体系。查看该接口发现它有7个方法需要实现,这起个方法对应7个动作。如果我仅对其中的1个动作进行处理,却需要同时复写其他的6个方法,这样不方便与编程,所以java提供了一个WindowListener的抽象子类WindowAdapter。WindowAdapter虽然是抽象的,但没有抽象方法,它定义为抽象,是为不能直接建立对象,而让你去继承,复写你要想处理的动作方法。编程中,对事件监听器用匿名内部类的比较多。
当监听器接口的方法多于3个时,一般该监听器接口都用相应的Adapter(适配器)。

Action事件
按钮对应的是ActionEvent事件,ActionEvent对应的是ActionListener监听器。
只用按钮活动,就能执行,而键盘和鼠标都能让按钮活动。所以,如果对按钮处理的动作只有一种,最好使用ActionListener,因为鼠标键盘都会触发它。
ActionListener监听器接口只用一个方法actionPerfomed(),所以没有相应的Adapter,它是三个没有配适器的监听器接口之一。

演示:

/* 
 创建图形化界面步骤: 
1.创建fram窗体。 
2.对窗体进行基本设置。 
    比如大小,位置,布局。 
3.定义组件。 
4.将组件通过窗体的add方法添加到窗体中 
5.让窗体显示,通过setVisible(true)方法。 
 */
 import java.awt.*;
 import java.awt.event.*;
 class FrameDemo
 {
	 public static void main(String[] args)
	 {
		Frame f = new Frame("于腾飞-java");
		f.setSize(600,400);
		f.setLocation(300,200);
		//f.setBounds(300,200,600,400);这个动作和以上的设置产生效果一样
		f.setLayout(new FlowLayout());

		Button b = new Button("点击");

		f.add(b);
		
		f.addWindowListener(new WindowAdapter()
			{
				public void windowOpened(WindowEvent e)
				{
					System.out.println("被打开了");
				}
				public void windowActivated(WindowEvent e)
				{
					System.out.println("我在前端显示了!");
				}
				
				public void windowClosing(WindowEvent e)
				{
					System.out.println("X 关闭了");
					System.exit(0);
				}
			});
		//让按钮具备退出程序的功能。  
        /* 
        按钮就是事件源,那么选择哪一个监听器呢?
		通过关闭窗体实例了解到。想要知道那个组件具备什么样的特与监听器, 需要查看该组件对象的功能。
		那么通过查阅button的描述,发现支持一个特有监听addActionListener(ActionListener l); 
        是没有适配器的少数组件之一,只要事件方法超过3个的组件,都有配适器(Adapter); 
        */  
		b.addActionListener(new ActionListener()
		{
				public void actionPerformed(ActionEvent e)
				{
					System.out.println("点击 退出了!");
					//System.exit(0);
				}
		});
		
		f.setVisible(true);//让窗体显示
	 }
 }
鼠标事件
MouseEvent,它是所有组件都有的共性事件,所以它的添加监听器方法是定义在Component抽象类中,键盘事件也是共性事件。
它对应的是MouseListener。
鼠标单击次数是定义在MouseEvent事件对象中的,在MouseEvent事件对象中还能还封装了触发事件的是鼠标的一些相关信息。MouseListener有对应的MouseAdapter。
 
键盘事件
KeyEvent事件对象,内部封装了对应于键盘各个键的字段和触发事件的具体按键的信息。
这些信息可以通过该对象对外提供的方法获取到。keyEvent 对应的事件监听器的KeyListener·,有对应的KeyAdapter。

import java.awt.*;
import java.awt.event.*;
class MouseAndKey 
{
	private Frame f;
	private Button b;
	private TextField tf;
	
	MouseAndKey()
	{init();}
	
	public void init()
	{
		f = new Frame("于腾飞-JAVA");
		f.setBounds(300,200,600,500);
		f.setLayout(new FlowLayout());
		
		b= new Button("点击");
		
		tf = new TextField(20);

		f.add(tf);
		f.add(b);
		
		myEvent();
		f.setVisible(true);
	}
	public void myEvent()
	{
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.out.println("X 关闭了");
				System.exit(0);
			}
		});
		b.addMouseListener(new MouseAdapter()//给button添加鼠标事件
		{
			private int c=1;
			private int i=1;
			public void mouseEntered(MouseEvent e)
			{
				System.out.println("鼠标进入点击区域次数--"+c++);
			}
			public void mouseClicked(MouseEvent e)
			{
				if(e.getClickCount()==2)
					System.out.println("双击鼠标次数--"+i++);
				if(e.getClickCount()==3)
					System.exit(0);
			}
		});
		b.addKeyListener(new KeyAdapter()//给button添加键盘事件
		{

			public void keyPressed(KeyEvent e)
			{
				if(e.isControlDown()&&e.getKeyCode()==e.VK_ENTER)
					System.exit(0);
				System.out.println(e.getKeyText(e.getKeyCode())+"----"+e.getKeyCode());
			}
		});

		tf.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e)
			{
				int code = e.getKeyCode();
				if(code==e.VK_ENTER)
					System.exit(0);
				if(!(code>=e.VK_0 && code<=e.VK_9))
				{  
                    //不处理,取消掉事件,具有屏蔽键的作用,如果键入是字符非法则不写入文本框。  
                    e.consume();//从父类InputEvent中获取的方法consume,不按照默认的方法处理该事件。  
                    System.out.println(e.getKeyText(code) + "....是非法的");  
                }
			}
		});
	}
	public static void main(String[] args) 
	{
		new MouseAndKey();
	}
}
对话框
Dialog在构造时,可以设置模式,如果为true那么,在该对话框关闭前,程序的其他窗口都不能被操作。
其体系如下:
|----Dialog
         |----FileDialog文件对话框,可以从中选择文件。
         |----JDialog

label对象是一个可在容器中放置文本的组件;

import java.io.*;
import java.awt.*;
import java.awt.event.*;
class MyWindowDemo 
{
	private Frame f;
	private Button b;
	private TextField tf;
	private TextArea ta;
	private Dialog d;
	private Button okb;
	private Label l;

	MyWindowDemo()
	{init();}
	
	public void init()
	{
		f = new Frame("于腾飞-JAVA");
		f.setBounds(300,200,600,500);
		f.setLayout(new FlowLayout());
		
		b= new Button("跳转");
		
		tf = new TextField(70);

		ta = new TextArea(20,70);

		d= new Dialog(f,"提示信息",true);
		d.setBounds(300,200,300,150);
		d.setLayout(new FlowLayout());
		
		l=new Label();
		okb = new Button("确定");
		
		d.add(l);
		d.add(okb);
		
		
		f.add(tf);
		f.add(b);
		f.add(ta);
		
		myEvent();
		f.setVisible(true);
	}
	public void myEvent()
	{
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.out.println("X 关闭了");
				System.exit(0);
			}
		});
		b.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				showDir();
			}
		});
		tf.addKeyListener(new KeyAdapter()
		{

			public void keyPressed(KeyEvent e)
			{
				if(e.getKeyCode()==e.VK_ENTER)
				{
					showDir();
				}
			}
		});
		d.addWindowListener(new WindowAdapter()  
        {  
            public void windowClosing(WindowEvent e)  
            {  
                d.setVisible(false);  
            }  
        });
		okb.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e)
			{
				if(e.getKeyCode()==e.VK_ENTER)
					d.setVisible(false);
			}
		});
		okb.addActionListener(new ActionListener()  
        {  
            public void actionPerformed(ActionEvent e)  
            {  
                d.setVisible(false);  
            }  
        }); 	
	}
	private void showDir()  
    {  
        //获取文本框内容,并封装成File 对象  
        String dirPath = tf.getText();  
        File dir = new File(dirPath);  
        //判断File对象是否存并且是否是目录  
        if(dir.exists()&&dir.isDirectory())  
        {  
            //清空文本区域内容  
            ta.setText("");  
            //使用File的list方法列出目录下的文件名字  
            String [] names = dir.list();  
            for(String name:names)  
            {  
                //append方法可以说实现对文本区域添加文本  
                ta.append(name+"\r\n");  
            }  
        }  
        else//如果不是目录则弹出错误对话框  
        {  
            //其实这个dialog窗体要在这时创建,以优化内存,将其在初始化时就创建是为了演示。  
            String info="您输入的路径信息("+dirPath+"):是错误的,请确认再重新输入";  
            l.setText(info);  
            d.setVisible(true);  
        }  
        //清空文本框内容  
        tf.setText("");       
    }  
	public static void main(String[] args) 
	{
		new MyWindowDemo();
	}
}
菜单
主要由三个类组成:MenuBar,Menu和MenuItem。
MenuBar:菜单条,里边只能添加Menu。
Menu:可以添加MenuItem菜单条目,如果这个MenuItem是一个Menu,那么这个Menu是一个子菜单。
MenuItem:菜单条目。

package mymenu;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.JDialog;

public class MyMenuTest 
{
	private Frame f;
	private MenuBar mb;
	private Menu m;
	private MenuItem closeItem,openItem,saveItem;
	private TextArea ta;
	private FileDialog diaOpen,diaSave;
	private File file;

	MyMenuTest()
	{
		init();
	}
	public void init()
	{
		f = new Frame("MyMenuTest");
		f.setBounds(400,300,600,500);
		//f.setLayout(new FlowLayout());//使用默认的边界布局管理器
		
		
		//设置菜单
		mb = new MenuBar();
		m = new Menu("文件");
		openItem = new MenuItem("打开");
		saveItem = new MenuItem("保存");
		closeItem= new MenuItem("退出");
		
		m.add(openItem);
		m.add(saveItem);
		m.add(closeItem);
		mb.add(m);
		//设置文本区域
		ta = new TextArea();
		
		//建立文件打开和保存对话框
		diaOpen = new FileDialog(f,"打开",FileDialog.LOAD);
		diaSave = new FileDialog(f,"保存",FileDialog.SAVE); 
		
		//将菜单条添加到Frame上。
		f.setMenuBar(mb);
		f.add(ta);
		//添加事件
		myEvent();
		
		//设置显示
		f.setVisible(true);
	}
	public void myEvent()
	{			
		//打开文件
		openItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{	
				//启动文件打开对话框
				diaOpen.setVisible(true);
				//获得选取的文件所在的目录
				String dirPath = diaOpen.getDirectory();
				//获得选取的文件的文件名字,如果没有选取,则返回null(即点击的是取消按钮),这要处理一下
				String fileName = diaOpen.getFile();
				if(dirPath==null && fileName==null)
					return;
				//选取有效文件后,清空文本区域
				ta.setText("");
				//将选取的文件读到文本区域中
				file = new File(dirPath,fileName);
				//对IO异常进行处理,将文件内容加到文本区域中
				try
				{
					BufferedReader bufr = new BufferedReader(new FileReader(file));
					StringBuilder sb = new StringBuilder();
					String line = null;
					while((line=bufr.readLine())!=null)
					{
						sb.append(line+"\r\n");
					}
					ta.append(sb.toString());
					bufr.close();
				}
				catch (IOException ex)
				{
					 throw new RuntimeException("读取失败");
				}
				
			}
		});
		//保存文件
		saveItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
			//文件是否存在
				//如果文件不存在,就打开文件保存对话框
				if(file==null)
				{
					diaSave.setVisible(true);
					String dirPath = diaSave.getDirectory();
					String fileName = diaSave.getFile();
					file = new File(dirPath,fileName);
					//防止点击取消按钮产生异常,这时直接返回
					if(dirPath==null && fileName==null)
						return ;
				}
				//上边的代码保证了文件肯定存在,然后开始保存数据
				try
				{
					BufferedWriter bufw = new BufferedWriter(new FileWriter(file));
					bufw.write(ta.getText());
					bufw.close();
					
				}
				catch (IOException ex)
				{
					throw new RuntimeException();
				}
				
			}
		});

		//通过菜单关闭
		closeItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
			
				System.exit(0);	
			}
		});
		//frame关闭事件处理
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
	}


	public static void main(String[] args) 
	{
		new MyMenuTest();
	}
}

GUI双击jar包执行
写好读到GUI程序,可以封装成jar包,通过对系统进行设置,使得双击jar包后,程序可以执行。以上边的写的记事本程序为例:
操作步骤:
1.在源文件的第一行加上包:package mymenu
2.dos命令行中启动“javac  -d  c:\myclass MyMenuTest.java”命令。
3.在menu包所在目录下,新建一个名为“1.txt”的文本文档,里边录入一下内容:
Main-Class: mymenu.MyMenuTest
注意:1,冒号后面要有一个空格;2,末尾一定要加换行符,即敲一下Enter键。
4.在dos切换到c:\myclass目录下,启动”jar –cvfm my.jar 1.txt mymenu”命令,这时得到的jar包即可启动。
 
在此之前要先将jar文件注册的系统中,其过程如下:
xP系统:工具à文件夹选项à文件类型à新建扩展名为jar的文件类型à选中jar,
点击“高级”按钮à更改图标,图标可以任意选;点击”新建”按键à添加open操作,操行名称写完“open”,用于执行操作的程序选择JDK目录下的javaw工具,并在末尾加上–jar参数。
Win7系统:
1、选择默认程序:右击jar包,打开方式->选择默认程序->浏览,选中jre下bin文件中javaw.exe(比如我的javaw.exe在D:\ProgramFiles\Java\jre6\bin下)。
2、编辑注册表:HKEY_CLASSES_ROOT\Applications\javaw.exe\shell\open\command,修改数据数值为"D:\ProgramFiles\Java\jdk1.6.0_21\jre\bin\javaw.exe" -jar "%1"(只要在原来的数值下添加-jar即可)。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值