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

黑马程序员-Java学习13-GUI

2014-12-25 16:40 225 查看
-----------android培训java培训java学习型技术博客、期待与您交流!------------

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

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

A.对于XP系统:

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

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

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

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

B.对于win7系统:

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

-----------android培训java培训java学习型技术博客、期待与您交流!------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: