您的位置:首页 > 产品设计 > UI/UE

黑马程序员-Java基础-GUI编程

2013-12-03 09:52 489 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
 * GUI(Graphical user interface)图形用户接口

 * CLI(command line user interface)命令行用户接口,也就是常见的DOS命令行

GUI的组件对象都在Java.awt和javax.swing包。

l早期的java提供的GUI类库(java.awt)称之为Abstract Window Toolkit,即AWT,
AWT功能不是很好,不能很好的访问操作系统中高级的GUI特性,生成的程序外观很一般。
lSwing是JDK1.2以后提供的GUI类库,即:javax.swing,使用方便,界面更加美观。它提供的组件会在前面加上J以示区分,如Jframe.

GUI体系结构

 *                                  component

 *            |--container               |--button label checkbox 
 *     |--window       |--panel                         |-- textCompenent    

 * |--f rame   |--dialog                            |-- TextArea      |--TextField

 *             |--fileDialog
component是构件,位于最顶层。
container是容器,可以通过add()方法添加其他组件进来。用于放置其他组件,如:Frame,JFrame,Applet;

布局管理器负责安排GUI组件的位置,java中布局管理器提供以下几种布局功能:

lFlowLayout:从左到右的次序放置组件;panel默认的布局
lBorderLayout:将容器的分成东、西、南、北、中5个区域;frame默认布局
lGridLayout:按行和列排列;
lBoxLayout:从左到右或从上到下放置组件;
lCardLayout:将组件重叠堆放;
GridBagLayout:与GridLayout类似,但组件的次序可变,并且能以任何次序添放组件.

 * 创建图形化界面:
* 1、创建f窗体

* 2、对窗体进行基本设置

*  比如大小,位置,布局
 * 3、定义组件

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

* 5、让窗体显示,通过setViserble(true)

 * 事件监听机制的特点:

 * 1、事件源:就是awt或Swing包中的图形界面组件

 * 2、事件:每一个事件源都有自己特有的对应事件和共性事件

 * 3、监听器:将可以触发某一个事件的动作(不止一个动作)都已经封装到了监听器中。

 * 4、事件处理

 * 前三者在Java中已经定义好了,直接获取其对象来用就可以。

 * 我们要做的事情,就是对产生的动作进行处理。
GUI 体系结构图如下:



awt包中组件结构和swing包中结构如下:





1、鼠标键盘监听事件代码演示:
package com.itheima.day22;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MouseAndKeyEvent
{
private Frame f;
private Button but;
private TextField tf;
MouseAndKeyEvent()
{
init();
}
public  void init()
{
f = new Frame("my Frame");
f.setBounds(300, 300, 500, 400);//设置组件,并调整其大小。距左边,距右边(设置位置),宽,高(设置大小)
f.setLayout(new FlowLayout());//设置窗口布局为流式布局
but = new Button("my button");
tf = new TextField(20);//创建文本域
f.add(tf);//将文本域添加进窗体中
f.add(but);//将按钮添加进窗体中
f.setVisible(true);//设置窗口可见

myEvent();//加载监听事件
}
public void myEvent()
{
//窗口事件
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//活动事件
but.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
System.out.println("Action ok ");
}

});
//鼠标事件
but.addMouseListener(new MouseAdapter()
{
private int count=0;
private int clickcount=0;
public void mouseEntered(MouseEvent e)
{
//System.out.println("鼠标进入事件"+count++);
}
public void mouseClicked(MouseEvent e)
{
if(e.getClickCount()==2)
System.out.println("双击事件"+clickcount++);
System.out.println("鼠标单击"+clickcount++);
}
});
//键盘事件
but.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_ESCAPE)
System.exit(0);
/*
if(e.isControlDown()&& e.getKeyCode()==KeyEvent.VK_ENTER)
{
//isControlDown()是inputEnvent(KeyEnvent的父类)中的方法
System.out.println("ctrl+enter  is run ");
}*/
//System.out.println(KeyEvent.getKeyText(e.getKeyCode())+"---"+e.getKeyCode());
}
});
tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
int code = e.getKeyCode();
if(!(code>=KeyEvent.VK_0 && code<=KeyEvent.VK_9))
{
System.out.println(code+"---是非法的");
e.consume();
}
}
});

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

}


2、输入框中输入盘符或文件地址,在下方文本域显示目录文件简单窗口演示,图如下:



代码如下:
package com.itheima.day22;

import java.awt.Button;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;
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;

public class MyWindowTest
{
private Frame f;
private TextField tf;
private Button but;
private TextArea ta;

private Dialog d;
private Label lab;
private Button dbut;

MyWindowTest()
{
init();
}
public  void init()
{
f = new Frame("my Frame");
f.setBounds(300, 300, 500, 400);
f.setLayout(new FlowLayout());
tf = new TextField(30);
but = new Button("转到");
ta = new TextArea(15,40);//行,列

d = new Dialog(f,"提示信息",true);
lab = new Label();
dbut = new Button("确认");
d.setBounds(200, 200, 300, 200);
d.setLayout(new FlowLayout());
d.add(lab);
d.add(dbut);

f.add(tf);
f.add(but);
f.add(ta);
f.setVisible(true);
myEvent();
}
public void myEvent()
{
//窗口事件
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
d.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
d.setVisible(false);
}
});
//活动事件
but.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
showDir();
}
});
dbut.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
showDir();
d.setVisible(false);
}
});
tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
int code = e.getKeyCode();
if(code==KeyEvent.VK_ENTER)
{
showDir();
}
}
});

}
private  void showDir()
{
String dirPath = tf.getText();//TextField父类中的方法
File dir = new File(dirPath);
if(dir.exists() && dir.isDirectory())
{
ta.setText("");
String[] names = dir.list();
for(String name : names)
{
ta.append(name+"\r\n");//追加文本
}
}
else
{
String info ="您输入的信息:   "+dirPath+"  有误,请重新输入";
lab.setText(info);
d.setVisible(true);
}
}
public static void main(String[] args)
{
new MyWindowTest();
}
}


3、简单记事本程序演示:它具有打开文件,保存文件,如果是已经存在的文件,保存时不会弹出保存对话框。图片如下:



代码如下:
package com.itheima.day22;

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.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class MyMenuTest
{

private Frame f;
private MenuBar mb;
private Menu m,submenu;
private MenuItem subItem;
private MenuItem openItem,saveItem,closeItem;
private FileDialog opendia,savedia;
private TextArea ta;
private File file;
MyMenuTest()
{
init();
}
public  void init()
{
f = new Frame("my Frame");
f.setBounds(300, 300, 800, 500);
//f.setLayout(new FlowLayout());如果不写布局就会默认边界布局,文本域全部填充
mb = new MenuBar();
m = new Menu("文件");
submenu = new Menu("子菜单");
subItem = new MenuItem("子条目");
openItem = new MenuItem("打开");
saveItem = new MenuItem("保存");
closeItem = new MenuItem("退出");
ta = new TextArea();

opendia = new FileDialog(f,"打开文件",FileDialog.LOAD);
savedia = new FileDialog(f,"保存文件",FileDialog.SAVE);

m.add(submenu);
submenu.add(subItem);

m.add(openItem);
m.add(saveItem);
m.add(closeItem);
mb.add(m);
f.setMenuBar(mb);
f.add(ta);

f.setVisible(true);
myEvent();
}
private void myEvent()
{
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//打开目录事件
openItem.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
opendia.setVisible(true);
String dirPath = opendia.getDirectory();
String filename = opendia.getFile();
System.out.println(dirPath+"--"+filename);
if(dirPath == null || filename == null)
return ;
ta.setText("");//当选择有效文件时,清空之前的内容
File file = new File(dirPath,filename);
try {
BufferedReader bufr = new BufferedReader(new FileReader(file));
String line = null;
while((line=bufr.readLine())!=null)
{
ta.append(line+"\r\n");
}
bufr.close();
} catch (IOException e1) {
throw new RuntimeException("读取失败");
}

}
});
//保存目录事件
saveItem.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
if(file==null)
{
savedia.setVisible(true);
String dirPath = savedia.getDirectory();
String filename = savedia.getFile();
System.out.println(dirPath+"--"+filename);
if(dirPath == null || filename == null)
return ;
file = new File(dirPath,filename);
}
try {
BufferedWriter bufw = new BufferedWriter(new FileWriter(file));
String text = ta.getText();
bufw.write(text);
bufw.flush();
bufw.close();
} catch (IOException e1) {
throw new RuntimeException("保存文件失败");
}
}
});
closeItem.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});

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

}

---------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
                                               详细请查看:http://edu.csdn.net
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: