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

黑马程序员——GUI

2015-10-18 13:49 477 查看
-------
android培训、java培训、期待与您交流! ----------
一、基础

1、概述

GUI与CLI :

•GUI= Graphical User Interface(图形用户接口)。 用图形的方式,来显示计算机操作的界面,这样更方便更直观。 

•CLI= Command line User Interface (命令行用户接口)。就是常见的Dos命令行操作。 需要记忆一些常用的命令,操作不直观。

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

Awt 与 Swing :


java.Awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能,会随着操作系统不同界面有所不一样。属重量级控件。


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

继承关系图 :

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





2、布局

容器(Container)中的组件的排放方式,就是布局。

常见的布局管理器:

 • FlowLayout(流式布局管理器)


 
1、不限制他所管理组件大小,(即:不能改变组件的大小)允许他们有最佳大小。

2、当容器被缩放时,组件的位置可能变化,但组件的大小不变。
3、默认组件是居中对齐,可以通过FlowLayout(int align)函数,来指定对齐方式。
4、从左到右的顺序排列。
5、Panel默认的布局管理器。    
BorderLayout(边界布局管理器)


1、 东,南,西,北,中。五个部分

1、 不是五个部分都必须添加

2、 中部组件会自动的调节大小

3、 Frame、JFrame,JDialog默认布局管理器就是BorderLayout 
GridLayout(网格布局管理器)


规则的矩阵

1、组件添加顺序从左到右,从上到下。

2、组件的相对位置不随容器缩放而变化,但大小会变化。

3、所有组件的大小相同。

4、可以通过GridLayout(int rows,int cols,int hgap,int vgap)来指定网络的行/列,水平间隙/垂直间隙。
GridBagLayout(网格包布局管理器)


非规则的矩阵
CardLayout(卡片布局管理器)


选项卡
3、创建图形化界面

步骤(以Frame为例):

1,创建frame窗体。Frame f = new Frame("my awt");

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

比如大小(setSize()),位置(setLacation()),布局(setLayout(new FlowLayout()) )。

3,定义组件。Button b = new Button("我是一个按钮")

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);
f.setLocation(300,200);
f.setLayout(new FlowLayout());

Button b = new Button("我是一个按钮");

f.add(b);

f.setVisible(true);
}
}


运行结果:



但是,该窗口没任何动能,连关闭按钮都无法使用。需要添加监听器和事件的处理方式

二、事件监听机制


  

步骤:

1、确定事件源(容器或组件) 

2、通过事件源对象的addXXXListener()方法将侦听器注册到该事件源上。

3、向步骤2的方法中传入相应的参数。

      一般为XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。

      在实现或者继承时一般用匿名内部类。

      然后覆盖方法,方法的参数一般是XXXEvent类型的变量接收。

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


4、事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponent()获取。

f025

ps:一般接口类XXXListener中的方法大于或等于3个时,就会有相应的适配器类XXXAdapter。XXXAdapter类只是用空方法实现了XXXListener类,所以此时只需继承XXXAdapter类,覆写其中需要的方法即可,不需覆写所有的方法。如WindowListenerWindowAdapter

例:向窗口和按钮添加关闭功能

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

class FrameDemo
{
private Frame f;
private Button but;

FrameDemo()
{ init(); }

public void init()
{
f = new Frame("my frame");

//对frame进行基本设置。
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
but = new Button("my button");

f.add(but);

//加载一下窗体上事件。
myEvent();

f.setVisible(true);
}

//统一再该方法中注册侦听器
private void myEvent()
{
//注册侦听器,通过内部类继承WindowAdapter,覆写相应方法,当事件触发时,执行该方法。
f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });

//让按钮具备退出程序的功能
/*
按钮就是事件源。
那么选择哪个监听器呢?
通过关闭窗体示例了解到,想要知道哪个组件具备什么样的特有监听器。
需要查看该组件对象的功能。
通过查阅button的描述。发现按钮支持一个特有监听addActionListener。
*/
but.addActionListener(new ActionListener()
{
private int count = 1;
public void actionPerformed(ActionEvent e)
{
System.out.println("退出,按钮干的");
System.exit(0);
}
});
}
public static void main(String[] args)
{
new FrameDemo();
}
}


共性事件(鼠标键盘的监听)

该监听适用于所有的Component子类,因此注册监听器方法在Component类中。

鼠标监听MouseListener ,可以监听鼠标的进入、离开、单击等事件。其中单击与ActionListener的区别在于ActionListener可以监听来自键盘对按钮的点击。

向按键but中注册鼠标监听
but.addMouseListener(new MouseAdapter()
{
private int count = 1;
private int clickCount = 1;
public void mouseEntered(MouseEvent e)
{
System.out.println("鼠标进入到该组件"+count++);
}
public void mouseClicked(MouseEvent e)
{
if(e.getClickCount()==2)
System.out.println("双击动作"+clickCount++);
}
});

键盘监听KeyListener,可以监听键盘某个键的按下、释放、键入等。

也可以过滤文本框中键入的值,如:

//通过注册键盘监听器,过滤文本框tf中输入的非数字内容
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();
}
}
});


也可以判断Ctrl+Enter

but.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
System.out.println("ctrl+enter is run");
}
});


三、对话框(Dialog

何时需要产生对话框:此对象时需要在调用时,才创建对象。如:当在误操作的时候,就需要出现提示错误信息的对话框,此时才创建的这个对象。

其中一个构造函数

   Dialog(Frame owner, String title,
boolean modal)
 

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

若modal为true时,Dialog显示 Frame不可操做

其他操作与Frame类似。

例:对列出指定目录内容示例的功能增强。

import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyWindowDemo
{
private Frame f;
private TextField tf;
private Button but;
private TextArea ta;

private Dialog d;
private Label lab;
private Button okBut;

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

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(new FlowLayout());
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);
}
private void myEvent()
{

okBut.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
d.setVisible(false);
}
});
d.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
d.setVisible(false);
}
});

tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_ENTER)
showDir();
}
});

but.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
showDir();

}
});

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

private void showDir()
{
String dirPath = tf.getText();

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 MyWindowDemo();
}
}


四、菜单

三个常用组件:菜单栏MenuBar 、菜单Menu 、菜单项MenuItem



继承关系:

MenuComponent

      |--Menubar

      |--MenuItem

             |--Menu

菜单的添加:

1、通过调用Frame的setMenuBar()方法,将菜单栏Menubar添加进窗口。

2、在Menubar添加相应的菜单Menu

3、再向Menu中添加菜单项MenuItem或者子菜单。

Frame f = new Frame("MenuDemo");
f.setBounds(400, 250, 300, 220);

//初始化菜单组件
MenuBar mbar = new MenuBar();
Menu menu1 = new Menu("我是菜单");
Menu menu2 = new Menu("我是子菜单");
MenuItem closeItem = new MenuItem("关闭");
MenuItem item = new MenuItem("我是菜单项");

//通过Frame方法setMenuBar(),在Frame窗口中设置菜单栏mbar。
f.setMenuBar(mbar);
//向菜单栏mbar中添加菜单menu1。
mbar.add(menu1);
//在菜单 menu1 中加入 关闭菜单项closeItem和 子菜单menu2
menu1.add(menu2);
menu1.add(closeItem);
//在子菜单menu2中添加菜单项item
menu2.add(item);


ps:Menubar中只能添加Menu,不能添加其父类MenuItem。而且同一个MenuItem对象不能同时添加进两个Menu中。



添加事件监听:

菜单项调用方法addActionListener(ActionListener  l) 添加,添加方式与按钮中添加ActionListener 一致。

如,向关闭菜单项中添加关闭功能:

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


例:包含关闭功能的简单菜单窗口

import java.awt.*;
import java.awt.event.*;
class MenuDemo
{
Frame f = null;
MenuBar mbar = null;
Menu menu1 = null,menu2 = null;
MenuItem item = null,closeItem = null;

MenuDemo()
{
init();
}

private void init()
{
f = new Frame("MenuDemo");
f.setBounds(400, 250, 300, 220);

//初始化菜单组件
mbar = new MenuBar();
menu1 = new Menu("我是菜单");
menu2 = new Menu("我是子菜单");
closeItem = new MenuItem("关闭");
item = new MenuItem("我是菜单项");

//通过Frame方法setMenuBar(),在Frame窗口中设置菜单栏mbar。
f.setMenuBar(mbar);
//向菜单栏mbar中添加菜单menu1。
mbar.add(menu1);
//在菜单 menu1 中加入 关闭菜单项closeItem和 子菜单menu2
menu1.add(menu2);
menu1.add(closeItem);
//在子菜单menu2中添加菜单项item
menu2.add(item);

myEvent();

f.setVisible(true);
}

private void myEvent()
{
//向关闭菜单项中添加关闭功能
closeItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } });
}

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


运行结果:



五、打开与保存文件(FileDialog

FileDialog 是 Dialog的子类,显示一个对话框窗口,用户可以从中选择文件。

使用方法:

1、先构造一个不显示的对话框窗口:

FileDialog(Frame parent, String title,
int mode)
 

      其中mode - 对话框的模式,可以是 FileDialog.LOAD(加载文件) 或 FileDialog.SAVE(保存文件)

2、在需要显示的时候调用 setVisible(true)  弹出窗口。

3、调用方法getDirectory()、 getFile() 获取目标文件的目录及文件名。如果在窗口中没有选择文件,而是选择了取消,则这两个方法的返回值为null

例:在监听器中加入文件对话框操作

FileDialog openDia = new FileDialog(f,"我要打开",FileDialog.LOAD);//这里模式如果为FileDialog.SAVE,则对话框为保存文件对话框
File file;

openItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
openDia.setVisible(true);
String dirPath = openDia.getDirectory();
String fileName = openDia.getFile();

//判断,如果用户没有选择文件,则不做任何操作。
if(dirPath==null || fileName==null)
return ;
file = new File(dirPath,fileName);

/*
这里省略了一些代码
.
.
.
.
*/
}
});


练习:完成一个简单的记事本程序。

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

public class MyMenuTest
{
private Frame f;
private MenuBar bar;
private TextArea ta;
private Menu fileMenu;
private MenuItem openItem,saveItem,closeItem;

private FileDialog openDia,saveDia;

private File file;
MyMenuTest()
{
init();
}
public void 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);
}

private void myEvent()
{
saveItem.addActionListener(new ActionListener()
{

public void actionPerformed(ActionEvent e)
{
if(file==null)
{
saveDia.setVisible(true);

String dirPath = saveDia.getDirectory();
String fileName = saveDia.getFile();
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 ex)
{
throw new RuntimeException();
}

}
});

openItem.addActionListener(new ActionListener()
{
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 = 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 ex)
{
throw new RuntimeException("读取失败");
}

}
});

closeItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } });
f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });
}

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


六、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,双击试试!。哦了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java gui