java基础<图形用户界面GUI>

GUI概述

一、概述
        
 

       



Component:构件、组件                                                            Button:按钮
Container:容器(能添加组件)    Label:标签(封装文字)
Window:窗口   Checkbox:复选框
Frame:框架   TextCompent:文本组件
Dialog:对话框   TextArea:
FileDialog:文件对话框   TextFiled:

GUI布局

一、布局管理器分类
1.流式布局管理器 FlowLayout

2.边界式布局管理器 BorderLayout


如果不指定组件的方向,就会如右图所示,最大面积填充这个窗体(因为默认的情况就是居中),如果再添加组件那么就会继续覆盖。
3.网格布局管理器 GridLayout
例子:计算器

4.网格包布局管理器 GridBagLayout
例子:计算器
5.卡片布局管理器  CardLayout


6.坐标式布局 
JBulider,eclipse+图形化界面

****如果遇到混合式布局的情况,先需要用panel面板来存放布局****

Frame

一、概述

Frame 是带有标题和边框的顶层窗口。 

窗体的默认布局为 BorderLayout。 

二、代码
/*
创建图形化界面的思路:
1.创建frame窗体。
2.对窗体进行基本设置
比如大小,位置,布局。
3.定义组件。
4.将组件通过窗体的add方法添加到界面中
5.让窗体显示,通过setVisible(true)方法。

*/

import java.awt.*;
class  AwtDemo
{
	public static void main(String[] args) 
	{	
		Frame f=new Frame("my awt");//默认的布局为——边界式布局。
		f.setSize(500,400);//用来设置窗体的长和宽,(x,y)坐标轴的形式
		f.setLocation(300,200);//用来设置窗体左上角的顶点距离左、上的距离。
		f.setLayout(new FlowLayout());//将该窗体的布局改为流式布局		
		Button b=new Button("我是一个按钮");//创建一个按钮对象
		f.add(b);//向窗体f内添加一个按钮
		f.setVisible(true);//设置f这个窗体为可见,如果不设置则Frame不显示
		System.out.println("Hello World!");
	}
}

事件监听机制

一、概述



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

我们要做的事情就是对产生的动作进行处理。

窗体事件

一、窗体事件实现
Window类——> addWindowListener(WindowListener l) 方法——>WindowListener接口——>WindowAdapter抽象类
有两种方法实现事件监听
1.匿名内部类
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
			System.exit(0);			
			}
			
			
		});

2.继承WindowAdapter抽象类
class MyWin extends WindowAdapter
{
	public void windowClosing(WindowEvent e)
	{
		//System.out.println("window is closing..."+e.toString);
		System.exit(0);
	}

}

二、完整代码
import java.awt.*;
import java.awt.event.*;//事件监听需要导入此包
class  AwtDemo
{
	public static void main(String[] args) 
	{	
		Frame f=new Frame("my awt");//默认的布局为——边界式布局。
		f.setSize(500,400);//用来设置窗体的长和宽,(x,y)坐标轴的形式
		f.setLocation(300,200);//用来设置窗体左上角的顶点距离左、上的距离。
		f.setLayout(new FlowLayout());//将该窗体的布局改为流式布局		
		Button b=new Button("我是一个按钮");//创建一个按钮对象
		f.add(b);//向窗体f内添加一个按钮


		//f.addWindowListener(new MyWin());

		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
			System.exit(0);			
			}
			
			
		});


		f.setVisible(true);//设置f这个窗体为可见,如果不设置则Frame不显示
		System.out.println("Hello World!");
	}
}




class MyWin extends WindowAdapter
{
	public void windowClosing(WindowEvent e)
	{
		//System.out.println("window is closing..."+e.toString);
		System.exit(0);
	}

}

Action事件

一、概述
Button类——> addActionListener(ActionListener l)方法——>ActionListener接口
由于ActionListener内的方法少于三个,所以它没有adapter适配器。
二、代码
		b.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				System.exit(0);			
			}
		
		
		});

共性事件——鼠标事件和键盘事件

一、概述
1.Componet类——> addMouseListener(MouseListener l)——>MouseLister接口——>MouseAdapter抽象类
2.Component类——>addKeyListener(KeyListener l)——>KeyListener接口——>KeyAdapter抽象类
二、代码
1.鼠标事件代码
		but.addMouseLister(new MouseAdapter()
		{
			int count=1;
			public void mouseEntered(MouseEvent e)//鼠标进入组件事件
			{
				System.out.println("鼠标进入Button组件"+count++);			
			}

			public void mouseClicked(MouseEvent e)//鼠标点击事件。如果有action事件存在,那么也会先执行鼠标事件。
			{	
				if(e.getClickCount()==2)//用MouseEvent事件e来监听点击了几次
				System.out.println("鼠标点击了Button组件"+count++);
			}		
		});
2.键盘事件代码
		but.addKeyListener(new KeyAdapter()//键盘监听
		{
			public void keyPressed(KeyEvent e)//由键盘事件对象来获取键盘按下的键
			{
				//e.getKeyChar();获取按下了那些键
				//e.getKeyCode();获取按下键的“码”
				//KeyEvent.getKeyText();返回描述 keyCode 的 String,如 "HOME"、"F1" 或 "A"。
				if(e.getKeyCode()==27/*或者把27换成KeyEvent.VK_ESCAPE*/)//如果but是当前事件源,按下ESC则会退出
				{
					System.exit(0)
				}				
			}
		
		});
3.完整代码
import java.awt.*;
import java.awt.event.*;

class MouseAndKeyEvent 
{
	private Frame f;
	private Button but;
	private TextField tf;

	MouseAndKeyEvent()
	{
		init();

	}

	public void init()
	{
		f=new Frame("my frame");
		f.setBounds(300,100,600,500);
		f.setLayout(new FlowLayout());

		tf=new TextField(20);
		f.add(tf);
		but =new Button("my button");

		f.add(but);
		
		myEvent();
		f.setVisible(true);
	}

	private void myEvent()
	{
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
		
		but.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)//鼠标和键盘都可以让Action触发。
			{
				System.out.println("action OK");		
			}
		
		});


		but.addMouseListener(new MouseAdapter()
		{
			int count=1;
			public void mouseEntered(MouseEvent e)//鼠标进入组件事件
			{
				System.out.println("鼠标进入Button组件"+count++);			
			}

			public void mouseClicked(MouseEvent e)//鼠标点击事件。如果有action事件存在,那么也会先执行鼠标事件。
			{	
				if(e.getClickCount()==2)//用MouseEvent事件e来监听点击了几次
				System.out.println("鼠标点击了Button组件"+count++);
			}		
		});

		but.addKeyListener(new KeyAdapter()//键盘监听
		{
			public void keyPressed(KeyEvent e)//由键盘事件对象来获取键盘按下的键
			{
				//e.getKeyChar();获取按下了那些键
				//e.getKeyCode();获取按下键的“码”
				//KeyEvent.getKeyText();返回描述 keyCode 的 String,如 "HOME"、"F1" 或 "A"。
				if(e.getKeyCode()==27/*或者把27换成KeyEvent.VK_ESCAPE*/)//如果but是当前事件源,按下ESC则会退出
				{
					System.exit(0);
				}		
					
				if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)//实现ctrl+回车的组合键功能,其中isControlDown()是InputEvent类
				{                                                       //下继承过来的方法。
					System.exit(0);
				}
			}
		
		});
		
		tf.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e)
			{
				if(!(e.getKeyCode()>KeyEvent.VK_0&&e.getKeyCode()<KeyEvent.VK_9))
				{
					System.out.println("您输入的字符非法");
					e.consume();//简单来说,该方法是用来取消该事件的操作。
				}
			}		
		
		});
	}


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

列出指定目录内容(带有对话框)

一、代码
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class DialogDirectoryDemo2 
{
	private Frame f;
	private Button b;
	private TextField tf;
	private TextArea ta;
	private Dialog d;
	private Label l;
	private Button ok;

	
	DialogDirectoryDemo2()
	{
		init();
	}


	private void init()
	{
		f=new Frame("my frame");
		f.setBounds(300,200,500,600);
		f.setLayout(new FlowLayout());
		tf=new TextField(40);
		b=new Button("转到");
		ta=new TextArea(30,50);

		d=new Dialog(f,"错误提示",false);
		d.setBounds(400,300,200,100);
		d.setLayout(new FlowLayout());
		l=new Label("您所输入的目录不存在,请重新输入",Label.CENTER);
		ok=new Button("确定");
		d.add(l);
		d.add(ok);
		
		f.add(tf);
		f.add(b);
		f.add(ta);

		DemoEvent();
		f.setVisible(true);
		
	}

	public void DemoEvent()
	{
	/*1*/f.addWindowListener(new WindowAdapter()//监听f的WindowEvent e
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);			
			}
		
		});
		
	/*2*/d.addWindowListener(new WindowAdapter()//监听d的WindowEvent e
		{
			public void windowClosing(WindowEvent e)
			{
				d.setVisible(false);
			}
		});

	/*3*/ok.addActionListener(new ActionListener()//监听ok的ActionEvent
		{
			public void actionPerformed(ActionEvent e)
			{
				d.setVisible(false);
			}
		});


	/*4*/b.addActionListener(new ActionListener()//监听b的ActionEvent
		{
			public void actionPerformed(ActionEvent e)
			{
					show();
			}
					
		});
			
	
	/*5*/tf.addActionListener(new ActionListener()//监听tf的ActionEvent
		{
			public void actionPerformed(ActionEvent e)
			{
					show();
			}
					
		});

	}


	
	public void show() //将在TextField按下回车和点击Button做出的相同的事件响应进行封装
	{
				String s=tf.getText();
				File file=new File(s);
				if(file.isDirectory()&&file.exists())
				{	
					ta.setText("");
					String[] list=file.list();
					for(String str:list)
					{
						ta.append(str+"\r\n");					
					}
				}
				else
				{
					l.setText("你输入的目录\""+s+"\"不存在");
					d.setVisible(true);
							
				}
				tf.setText("");
	}



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

可以打开文件和保存文件的——GUI菜单

一、概述
菜单栏(MenuBar)——>菜单(Menu)——>菜单项(MenuItem)或者菜单(Menu,即子菜单)
二、代码
import java.io.*;
import java.awt.*;
import java.awt.event.*;
public class SaveAndOpenMenu 
{
	private Frame f;
	private TextArea ta;
	private MenuBar mb;
	private Menu m;
	private MenuItem mi1;
	private MenuItem mi2;
	private MenuItem mi3;
	private File file;

	SaveAndOpenMenu()
	{
		init();
	}

	public void init()
	{
		f=new Frame("DEMO");
		f.setBounds(500,400,400,500);
		ta=new TextArea();
		mb=new MenuBar();
		m=new Menu("选项");
		mi1=new MenuItem("保存");
		mi2=new MenuItem("打开");
		mi3=new MenuItem("关闭");
		mb.add(m);
		m.add(mi1);
		m.add(mi2);
		m.add(mi3);
		f.setMenuBar(mb);
		f.add(ta);
		f.setVisible(true);
		event();
		
	}

	public void event()
	{
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}		
		});

		mi3.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				System.exit(0);
			}
		});

		mi1.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				if(file==null)
				{
				FileDialog fd=new FileDialog(f,"保存文件",FileDialog.SAVE);
				fd.setVisible(true);
				String directory=fd.getDirectory();
				String name=fd.getFile();
				if(directory==null||name==null)
					return;
				file=new File(directory,name);
				}
				BufferedWriter bw=null;		
				try
				{
				String str=ta.getText();
				bw=new BufferedWriter(new FileWriter(file));
				bw.write(str);	
				bw.close();
				}
				catch (IOException ex)
				{
					throw new RuntimeException("文件保存出现问题");
				}
			}		
		});
		
		mi2.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				FileDialog fd=new FileDialog(f,"保存文件",FileDialog.LOAD);
				fd.setVisible(true);
				String directory=fd.getDirectory();
				String name=fd.getFile();
				if(directory==null||name==null)
					return;
				file=new File(directory,name);
				ta.setText("");
				BufferedReader br=null;
				try
				{
					br=new BufferedReader(new FileReader(file));
					String str=null;
					while((str=br.readLine())!=null)
					{
						ta.append(str+"\r\n");
					}
					br.close();
				}
				catch (IOException ex)
				{
					throw new RuntimeException("文件打开出现问题");
				}						
			}
				
		});


	
		}


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

JAR包双击执行

一、步骤
1.在dos环境下,.java所在文件的目录下执行以下代码
javac -d c:\ SavaAndOpenMenu.java
2.在c:\下执行以下代码
jar -cvf my.jar mymenu

但是执行以上代码会导致执行失败,原因是没有明确主函数的类。
所以需要进行以下操作
3.在c:\文件下创建一个随意命名的.txt文件,比如1.txt,并在1.txt文件中配置如下信息
Main-class: mymenu.SavaAndOpenMenu(并在信息配置结束后添加一个回车,表示该行信息配置已经到达结尾)
4.在c:\下执行以下代码
jar -cvfm my.jar 1.txt mymenu

经过以上操作即可实现JAR包双击执行。

(PS:以上步骤中的c:\文件自己指定,mymenu为类包。








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值