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

黑马程序员——java第二十二天:GUI

2013-09-25 08:44 471 查看

------- android培训java培训、期待与您交流! ----------

GUI

GUI——Graphical UserInterface(图形用户接口)。

CLI——Command line UserInterface (命令行用户接口)就是常见的Dos命令行操作。

Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中。

java.Awt:Abstract WindowToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。(快平台性较差)

javax.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。



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

布局



FlowLayout(流式布局管理器)

从左到右的顺序排列。

Panel默认的布局管理器。



BorderLayout(边界布局管理器)

东,南,西,北,中

Frame默认的布局管理器。



GridLayout(网格布局管理器)

规则的矩阵



CardLayout(卡片布局管理器)

选项卡



GridBagLayout(网格包布局管理器)

非规则的矩阵(与网络布局管理器不同的是一个组件有可能占多个格子)

Frame

创建图形化界面

1、创建Frame窗体

2、对窗体进行基本设置。比如:大小、位置、布局

3、定义组件

4、将组件通过窗体的add刚发添加到窗体中

5、让窗体显示。通过setvisible(true)

事件监听机制

创建图形化界面:

1,创建frame窗体。

2,对窗体进行基本设置。

比如大小,位置,布局。

3,定义组件。

4,将组件通过窗体的add方法添加到窗体中。

5,让窗体显示,通过setVisible(true)

事件监听机制的特点:

1,事件源。

2,事件。

3,监听器。

4,事件处理。

事件源:就是awt包或者swing包中的那些图形界面组件。

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

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

以上三者,在java中都已经定义好了。

直接获取其对象来用就可以了。

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

窗体事件

窗口监听器:f.addWindowListener(WindowListener 1);

说明:

WindowListener作为一个接口有7个方法需要实现者覆写。

WindowListener一个子类WindowAdapter为抽象类,他覆盖了父类的所有方法,但方法都为空。这样就可以继承WindowAdapter就方便创建侦听器对象和方法的书写(不可能只需要一个关闭窗口的动作,还要把所有的方法都覆写一遍吧)。

因为WindowListener在java.awt.event包中,所以图形化通常要导两个包awt和awt.event包

WindowListener中的方法:

windowClosing(WindowEvent e)关闭窗口动作方法

windowActivated(WindowEvente)激活窗口,每次窗口被激活就会执行这个方法中的动作(每次前置也是激活)。

windowOpened(WindowEvent e)当程序被打开是会执行这个动作。

Component中的方法:

void setBounds(int x,int y,int width,intheight);相当于setLacation()和setSize()两个方法。

getParent():获取此组件的父级。

validate():相当于刷新布局。(已经显示容器后,在修改此容器的子组件的时候,应调用此方法)

把图形化与事件分开:

1、在成员变量位置定义该图形中所需的组件引用:

例:private Frame=f;

2、在构造函数中调用生成图形化的方法,使对象已建立就具备这样的图形和事件功能。

例:init();

3、定义init方法(其方法中生成图形化界面,并加载事件方法)

一、对Frame进行基本设置

二、将组建添加到Frame中

三、加载一下窗体事件

四、显示窗体

4、定义事件方法(其中有监听的组件的方法事件)

按钮特有的监听器——addActionListeren.(中有待实现的方法actionPorformed(ActionEvent e);)

按钮是少数没有Adapter(适配器)其中一个。(一般方法超过三个就会有适配器,因为适配器覆写了接口中的所有方法(方法为空),有利于创建方法是覆写)

例子

package gui;
import java.awt.*;
import java.awt.event.*;
public class AwtDemo {
private Frame f;
private Button b;
public AwtDemo() {
super();
init();
}
private void init(){
//创建一个不可见得窗体,名字为awt
f=new Frame("awt");
//设置窗体大小,x轴方向500,y轴方向400
f.setSize(500, 400);
//设置窗体距离屏幕左上角的位置x轴相对位置300,y轴相对位置200
//f.setLocation(300, 200);
//把Frame默认布局边界布局改为流式布局。
//f.setLayout(new FlowLayout());
//以上两个方法替换为
f.setBounds(300, 200, 500, 400);
//创建名字“按钮”的按钮
b=new Button("关闭程序按钮按钮");
//把按钮添加进窗体中
f.add(b);
myEvent();
//设置窗体可见
f.setVisible(true);
}
private void myEvent() {
// TODO自动生成的方法存根
b.addActionListener(new ActionListener(){
int count=0;
public void actionPerformed(ActionEvent e) {
//System.out.println("按钮我关");
//System.exit(0);
Button bu=(Button) e.getSource();
Frame f1=(Frame) bu.getParent();
f1.add(new Button("button"+count++));
//刷新当前布局
f1.validate();
}
});
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.out.println("我关");
System.exit(0);
}
public void windowActivated(WindowEvent e){
System.out.println("激活");
}
public void windowOpened(WindowEvent e){
System.out.println("打开了");
}
});
}
public static void main(String[] args) {
new AwtDemo();
}
}


鼠标键盘事件

鼠标键盘方法都在Component类中,因为所有组件都可以涉及到键盘鼠标事件。

按钮有addActionListener(ActionListener l)监听,鼠标和键盘都能操作。

addMouseListener(MouseListenerl)监听,只间听鼠标对组件的操作。

当两者都存在监听单击时addMouseListener(MouseListener l)优先于addActionListener(ActionListener l)。

鼠标双击动作在MouseEvent类中有方法:e.getClickCount();//获取鼠标单击次数。

addKeyListener(Kyelistener l);方法多余三个所以有适配器类KeyAdapter。

Kyelistener接口中方法:keyPressed(KeyEvente);//按下某个键时调用此方法。

keyReleased(KeyEvent e);//释放某个键时调用此方法。

KeyEvent中方法:getKeyChar();返回为此按键事件定义的Unicode字符(可以理解为键盘上按下的键的字母)。

getKeyCode();返回键盘上实际键的整数代码(按下的键的代码)。

getKeyText(intkeyCode);返回物理键文本描述的字符串,物理键通过其keyCode标识(与getKeyChar()方法功能相同,只是字符串getKeyChar不能获取,并且他获得的是字符而不是字符串)。

在Event.InputEvent中有:

Boolean isControlDown()用于判段Ctrl键是否按下。(常用于组合键)。

void consume();使用此事件,以便不会按照默认的方式,有产生此事件的源代码来处理此事件(比如文本框不允许输入字母,就可以调用此方法,让其输不进字母)

例子

package gui;

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

public class MouseAndKeyEvent
{
privateFrame f;
privateButton but;
privateTextField tf;
MouseAndKeyEvent()
{
init();
}
publicvoid init()
{
f= new Frame("my frame");
f.setBounds(300,100,600,500);
f.setLayout(newFlowLayout());
tf= new TextField(20);
but= new Button("my button");
f.add(tf);
f.add(but);
myEvent();
f.setVisible(true);
}
privatevoid myEvent()
{
//窗体关闭监听
f.addWindowListener(newWindowAdapter()
{
publicvoid windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//文本框监听键盘输入监听
tf.addKeyListener(newKeyAdapter()
{
publicvoid keyPressed(KeyEvent e)
{
intcode = e.getKeyCode();
if(!(code>=KeyEvent.VK_0&& code<=KeyEvent.VK_9))
{
System.out.println(code+".....是非法的");
e.consume();
}
}
});
//给But添加一个键盘监听。
but.addKeyListener(newKeyAdapter()
{      //案件监听
publicvoid keyPressed(KeyEvent e)
{
if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
//System.exit(0);
System.out.println("ctrl+enteris run");

//System.out.println(KeyEvent.getKeyText(e.getKeyCode())+"...."+e.getKeyCode());
}
});
/**/
//对按钮监听(鼠标键盘都能操作)
but.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
System.out.println("actionok");
}
});

/**/
//鼠标监听(只有鼠标操作监听)
but.addMouseListener(newMouseAdapter()
{
privateint count = 1;
privateint clickCount = 1;
//鼠标进入按钮范围监听(只有鼠标操作监听)
publicvoid mouseEntered(MouseEvent e)
{
System.out.println("鼠标进入到该组件"+count++);
}
//鼠标双击监听
publicvoid mouseClicked(MouseEvent e)
{
if(e.getClickCount()==2)
System.out.println("双击动作"+clickCount++);
}
});

}
publicstatic void main(String[] args)
{
newMouseAndKeyEvent();
}
}


对话框

对文本框清空操作:ta.setText();

ta.append(String s);可以向文本框添加信息

Dialog类——对话框

构造函数其一——Dialog(Frame owner,String tile,Boolean model);

构造一个初始不可见的Dialog对话框,它带有指定的所有者Frame。标题和模式。

当模式为true时,弹出对话框后,所属后台框体不可操作。

让对话框不显示——d.setVisible(false);

例子:

import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyWindowDemo
{
privateFrame f;
privateTextField tf;
privateButton but;
privateTextArea ta;

privateDialog d;
privateLabel lab;
privateButton okBut;

MyWindowDemo()
{
init();
}
publicvoid init()
{
f= new Frame("my window");
f.setBounds(300,100,600,500);
f.setLayout(newFlowLayout());

tf= new TextField(60);

but= new Button("转到");

ta= new TextArea(25,70);

d= new Dialog(f,"提示信息-self",true);
d.setBounds(400,200,240,150);
d.setLayout(newFlowLayout());
lab= new Label();
okBut= new Button("确定");

d.add(lab);
d.add(okBut);

f.add(tf);
f.add(but);
f.add(ta);

myEvent();
f.setVisible(true);
}
privatevoid  myEvent()
{

okBut.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
d.setVisible(false);
}
});
d.addWindowListener(newWindowAdapter()
{
publicvoid windowClosing(WindowEvent e)
{
d.setVisible(false);
}
});

tf.addKeyListener(newKeyAdapter()
{
publicvoid keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_ENTER)
showDir();
}
});

but.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
showDir();

}
});

f.addWindowListener(newWindowAdapter()
{
publicvoid windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}

privatevoid showDir()
{
StringdirPath = tf.getText();

Filedir = new File(dirPath);

if(dir.exists()&& dir.isDirectory())
{
ta.setText("");
String[]names = dir.list();
for(Stringname : names)
{
ta.append(name+"\r\n");
}
}
else
{
Stringinfo = "您输入的信息:"+dirPath+"是错误的。请重输";
lab.setText(info);
d.setVisible(true);
}
}

publicstatic void main(String[] args)
{
newMyWindowDemo();
}
}


菜单

想Frame中添加(MenuBar)菜单条是通过setMenuBar添加的。

把菜单添加在菜单条上。

Menu(菜单)下可以添加MenuIteam(子条目),也可以添加Menu(菜单)作为子菜单(当做为子菜单是会有箭头)。

例子:

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

class MyMenuDemo
{
privateFrame f;
privateMenuBar mb;
privateMenu m,subMenu;
privateMenuItem closeItem,subItem;
MyMenuDemo()
{
init();
}
publicvoid init()
{
f= new Frame("my window");
f.setBounds(300,100,500,600);
f.setLayout(newFlowLayout());
mb= new MenuBar();
m= new Menu("文件");
subMenu= new Menu("子菜单");
subItem= new MenuItem("子条目");
closeItem= new MenuItem("退出");

subMenu.add(subItem);
m.add(subMenu);
m.add(closeItem);
mb.add(m);
f.setMenuBar(mb);
myEvent();
f.setVisible(true);
}
privatevoid myEvent()
{
closeItem.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
f.addWindowListener(newWindowAdapter()
{
publicvoid windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
publicstatic void main(String[] args)
{
newMyMenuDemo();
}
}


记事本

package gui;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class MyMenuTest{
privateFrame f;
privateMenuBar bar;
privateTextArea ta;
privateMenu fileMenu;
privateMenuItem openItem,saveItem,closeItem;
privateFileDialog openDia,saveDia;
privateFile file;
MyMenuTest()
{
init();
}
publicvoid init()
{
f= new Frame("my window");
f.setBounds(300,100,650,600);
bar= new MenuBar();
ta= new TextArea();
fileMenu= new Menu("文件");
openItem = new MenuItem("打开");
saveItem= new MenuItem("保存");
closeItem= new MenuItem("退出");
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(closeItem);
bar.add(fileMenu);
f.setMenuBar(bar);
openDia= new FileDialog(f,"我要打开",FileDialog.LOAD);
saveDia= new FileDialog(f,"我要保存",FileDialog.SAVE);
f.add(ta);
myEvent();
f.setVisible(true);
}
privatevoid myEvent()
{
saveItem.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
//如果文件存在就不用弹出对话框了
if(file==null)
{
saveDia.setVisible(true);
StringdirPath = saveDia.getDirectory();
StringfileName = saveDia.getFile();
//考虑取消问题
if(dirPath==null|| fileName==null)
return;
file= new File(dirPath,fileName);
}
try
{
BufferedWriterbufw  = new BufferedWriter(newFileWriter(file));
Stringtext = ta.getText();
bufw.write(text);
//bufw.flush();
bufw.close();
}
catch(IOException ex)
{
thrownew RuntimeException();
}
}
});
openItem.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
openDia.setVisible(true);
StringdirPath = openDia.getDirectory();
StringfileName = openDia.getFile();
//                         System.out.println(dirPath+"..."+fileName);
if(dirPath==null|| fileName==null)
return;
ta.setText("");
file= new File(dirPath,fileName);
try
{
BufferedReaderbufr = new BufferedReader(new FileReader(file));

Stringline = null;

while((line=bufr.readLine())!=null)
{
ta.append(line+"\r\n");
}

bufr.close();
}
catch(IOException ex)
{
thrownew RuntimeException("读取失败");
}

}
});
closeItem.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
f.addWindowListener(newWindowAdapter()
{
publicvoid windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
publicstatic void main(String[] args) {
newMyMenuTest();
}
}


/*

如何制作可以双击执行的jar包呢?

1,将多个类封装到了一个包(package)中。

2,定义一个jar包的配置信息。

定义一个文件a.txt 。文件内容内容为:

Main-Class:(空格)包名.类名(回车)

3,打jar包。

jar-cvfm my.jar a.txt 包名

4,通过winrar程序进行验证,查看该jar的配置文件中是否有自定义的配置信息。

5,通过工具--文件夹选项--文件类型--jar类型文件,通过高级,定义该jar类型文件的打开动作的关联程序。

jdk\bin\javaw.exe-jar

6,双击试试!。哦了。

------- android培训java培训、期待与您交流! ----------详细请查看:http://edu.csdn.net

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: