Java学习13-GUI


1.概述


Container:为容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件进来。

Container常用子类:Window   Panel(面板,不能单独存在。)

Window常用子类:Frame  Dialog

2.布局管理

1)、布局:容器中的组件排列方式
2)、常见的布局管理器:
        1)FlowLayout:流式布局管理器。从左向右排列,是Panel默认的布局管理器
        2)BorderLayout:边界式布局管理器,东南西北中的排列方式,是Frame的默认布局管理器。如果窗体中只有一个组件,将会覆盖整个窗体。
        3)GridLayout:网格式布局管理器,规则的矩阵
        4)CardLayout:卡片式布局管理器,即选项卡
        5)GridBayLayout:网格包布局管理器,非规则矩阵
3)、如果存在多种布局方式,如何创建窗体界面呢?步骤:
        1)先将窗体Frame进行大区域的划分,设置其布局管理器,加入面板Panel
        2)将组件加入Panel,设置面板的布局管理器。

3、简单的窗体创建过程

1)、创建Frame窗体:

        Frame f = new Frame("my Frame");//可设置标题,即窗体名字

2)、对窗体进行基本设置:如大小,位置,布局等:

        f.setSize(int wight,int hight);//窗体大小设置

        f.setLocation(int x,int y);//窗体显示位置设置,横纵坐标

        f.setBounds(int x,int y,int wight,int hight),也可以直接用这个方法对大小和位置设置

        f.setLayout(Layout layout),参数为指定的布局管理器,如FlowLayout

3)、定义组件:

       如Button b = new Button(my Button);//可设置组件的名称

4)、将组件通过窗体的add方法添加到窗体中:

        f.add(b);//将按钮组件添加进窗体

5、让窗体显示:

        f.setVisible(boolean b);//通过设置参数是true还是false是否显示窗体

4.事件监听机制的特点:

1,事件源。
       2,事件。
      3,监听器。
      4,事件处理。


事件源:就是awt包或者swing包中的那些图形界面组件。
 事件:每一个事件源都有自己特有的对应事件和共性事件。
监听器:将可以触发某一个事件的动作(不只一个动作)都已经封装到了监听器中。
以上三者,在java中都已经定义好了。
直接获取其对象来用就可以了。
我们要做的事情是,就是对产生的动作进行处理。

/*建立一上类似QQ登入的界面*/

package nuddles.j2seDemo;

import java.awt.*;
import java.awt.event.*;

class FrameDemo{
	// 创建工具类
	private Frame frame;
	private Button button;
	private TextField tf;
	FrameDemo(){
		init();
	}
	public void init(){
		// 初始化方法
		frame = new Frame("my frame");
		button = new Button("my button");
		tf = new TextField(20);
		frame.setBounds(300,100,600,500);
		frame.setLayout(new FlowLayout());
		frame.add(tf);
		frame.add(button);
		myEvent();
		// 调用事件监听方法
		frame.setVisible(true);

	}
	private void myEvent(){
		// 窗口关闭事件
		frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
		button.addActionListener(new ActionListener(){
			//按钮事件
			int count = 0;
			public void actionPerformed(ActionEvent e){
				count++;
				System.out.println("button clicked"+count);
				if (count>=5) {
					System.exit(0);
				}
			}
		});
		tf.addKeyListener(new KeyAdapter(){
			// 键盘事件
			public void keyPressed(KeyEvent ke){
				int code = ke.getKeyCode();
				System.out.println("haha");
				if (code<KeyEvent.VK_0||code>KeyEvent.VK_9) {
					ke.consume();
					System.out.println("these are not numbers");
				}
			}
		});
		button.addMouseListener(new MouseAdapter(){
			// 鼠标事件
			public void mouseClicked(MouseEvent e){
				if (e.getClickCount()==2) {
					System.exit(0);
				}
			}
		});
		button.addKeyListener(new KeyAdapter(){
			public void keyPressed(KeyEvent e){
				int code = e.getKeyCode();
				if (e.isControlDown()&&code==KeyEvent.VK_ENTER) {
					System.exit(0);
				}
			}
		});

	}

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


5.对话框:Dialog
        何时需要产生对话框:此对象时需要在调用时,才创建对象。如:当在误操作的时候,就需要出现提示错误信息的对话框,此时才创建的这个对象。
示例:
        对列出指定目录内容示例的功能增强。

import java.io.*;
import java.awt.*;
import java.awt.event.*;
 
class SearchBox  {
         // 定义工具类
         private Frame f;
         private TextField tf;
         private TextArea ta;
         private Button b;
         private Dialog dia;
         private Label la;
         private Button ok;
         SearchBox(){
                   init();
         }
         private void init(){
                   // 窗口初始化
                   f = new Frame("my frame");
                   tf= new TextField(30);
                   ta = new TextArea(30,40);
                   b = new Button("转到");
                   f.setBounds(300,300,500,500);
                   f.setLayout(new FlowLayout());
                   f.add(tf);
                   f.add(b);
                   f.add(ta);
                  dia = new Dialog(f,"notice",true);
                   dia.setBounds(300,300,400,400);
                   dia.setLayout(new FlowLayout());
                   la = new Label("nuddles haha");
                   ok = new Button("ok");
                   dia.add(la);
                   dia.add(ok);
                   myEvent();
                   f.setVisible(true);
 
         }
         private void myEvent(){
                   // 事件方法
                   f.addWindowListener(new WindowAdapter(){
                            public void windowClosing(WindowEvent e){
                                     System.exit(0);
                            }
                   });
                   tf.addKeyListener(new KeyAdapter(){
                            public void keyPressed(KeyEvent e){
                                     int code = e.getKeyCode();
                                     if (code==KeyEvent.VK_ENTER) {
                                               showDir();
                                     }
                            }
                   });
                   b.addActionListener(new ActionListener(){
                   public void actionPerformed(ActionEvent e){
                            showDir();
                            }
                   });
                   ok.addActionListener(new ActionListener(){
                   public void actionPerformed(ActionEvent ac){
                            dia.setVisible(false);
                            }
                   });
        
         }
         private void showDir(){
                   // 显示目录功能
                   ta.setText("");
                   String s = tf.getText();
                   File file =new File(s);
                   if (file.exists()&&file.isDirectory()) {
                            String[] str = file.list();
                            for(String ss:str){
                                     ta.append(ss+"\n\r");
                            }
                   }else {
                           
                            dia.setVisible(true);
                            tf.setText("");
 
                   }
         }
        
 
         public static void main(String[] args) {
                   new SearchBox();
         }
}

6、菜单:Menu

1)、菜单继承关系



2)、说明
        1)Menu:菜单,继承MenuItem;有右三角的图标存在,可添加Menu和MenuItem
        2)MenuBar:菜单栏,可添加菜单和菜单条目。一般先创建菜单栏,再创建菜单。
        3)MenuItem:菜单条目,也称菜单项,无右三角的图标存在,是最终的菜单项。
        4)菜单的事件处理和组件一样,可以对类型为MenuItem和Menu的对象这个事件源添加活动监听ActionListener,并进行相关的事件处理。
        5)通过setMenuBar()方法,将菜单添加到Frame中。

练习:打开-保存

import java.io.*;
import java.awt.*;
import java.awt.event.*;
 
public class MyMenuTest  {
         // 定义工具类
         private Frame f;
         private MenuBar mb;
         private Menu file;
         private MenuItem open,save,quit;
         private TextArea ta;
         private FileDialog openDia,saveDia;
         private File file1;
 
         MyMenuTest(){
                   init();
         }
         private void init(){
                   // 窗口初始化
                   f = new Frame("myFrame");
                   f.setBounds(300,300,400,400);
                   // f.setLayout(new FlowLayout());
                   ta = new TextArea();
                   mb = new MenuBar();
                   file= new Menu("file");
                   open = new MenuItem("open");
                   save = new MenuItem("save");
                   quit = new MenuItem("quit");
                   file.add(open);
                   file.add(save);
                   file.add(quit);
                   mb.add(file);
                   f.setMenuBar(mb);
                   f.add(ta);
                   openDia = new FileDialog(f,"i want to open",FileDialog.LOAD);
                   saveDia = new FileDialog(f,"i want to save",FileDialog.SAVE);
                   myEvent();
                   f.setVisible(true);
         }
         public void myEvent(){
                   // 各功能模块
                   f.addWindowListener(new WindowAdapter(){
                            public void windowClosing(WindowEvent e){
                                     System.exit(0);
                            }
                   });
                   open.addActionListener(new ActionListener(){
                            // 打开功能
                            public void actionPerformed(ActionEvent e){
                                     openDia.setVisible(true);
                                     String dir = openDia.getDirectory();
                                     String fileName = openDia.getFile();
                                     if (dir == null||fileName == null) {
                                               return;
                                     }
                                     ta.setText("");
                                     file1 = new File(dir,fileName);
                                     try{
                                               BufferedReader br = new BufferedReader(new FileReader(file1));
                                               String line = null;
                                               while ((line = br.readLine()) != null) {
                                                        ta.append(line+"\r\n");
                                               }
                                               br.close();
                                     }catch(IOException er){
                                               throw new RuntimeException("open error");
                                     }
 
                            }
                   });
 
                   save.addActionListener(new ActionListener(){
                            // 关闭功能
                            public void actionPerformed(ActionEvent e){
                                    
                                     if(file1 == null){
                                               saveDia.setVisible(true);
                                               String dir = saveDia.getDirectory();
                                               String fileName = saveDia.getFile();
                                               if (dir == null||fileName == null) {
                                               return;}
                                               file1 = new File(dir,fileName);
                                              
                                     }
                                     try{
                                                        BufferedWriter bw = new BufferedWriter(new FileWriter(file1));
                                                        String s1 = ta.getText();
                                                        bw.write(s1);
                                                        bw.close();
                                              
                                     }catch(IOException er){
                                               throw new RuntimeException("save error");
                                     }
 
                            }
                   });
 
                   quit.addActionListener(new ActionListener(){
                            // 退出功能
                            public void actionPerformed(ActionEvent e){
                                     System.exit(0);
                            }
                   });
         }
 
         public static void main(String[] args) {
                   new MyMenuTest();
         }
}

7、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中不会加入相应的加载主类的信息,也就是说配置清单的属性主类名称不会加载进清单中,也就不会执行。

        2jar文件必须在系统中注册,才能运行。注册方法如下:

        A.对于XP系统:

               a.打开任意对话框,在菜单栏点击工具按钮,选择文件夹选项

               b.选择新建--->扩展名,将扩展名设置为jar,确定

               c.选择高级,可更改图标,然后点击新建,命名为open

               d.在用于可执行应用程序中,点浏览,将jdk下的bin的整个文件路径添加进来,并在路径后添加-jar即可。

        B.对于win7系统:

               a.改变打开方式:右击.jar文件,点击打开方式,选择默认程序为jdkbin中的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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值