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

程序员_Java基础之<十三>图形化界面GUI

2013-04-27 23:06 591 查看
GUI

创建图形化界面:

1.创建frame窗体。

2.对窗体基本设置:比如:大小,位置,布局。

3.定义组件。

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

5.让窗体显示,通过setVisible(true)方法。

事件监听机制的特点:

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

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

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

以上三者,在java中已经定义好,直接获取对象来用就可以。

4.事件处理。这才是我们需要做的。

<span style="font-family:KaiTi_GB2312;font-size:18px;color:#333333;">import java.awt.*;
import java.awt.event.*;
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.addWindowListener(new MyWin());//添加一个监听器对象到窗体的添加监听器方法。
//通常通过匿名内部类的方法
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)//接收窗口关闭事件
{
sop("我关");
System.exit(0);
}
public void windowOpened(WindowEvent e)//窗口被打开
{
sop("我被打开了");
}

public void windowActivated(WindowEvent e)//窗口被前置
{
sop("我活了");
}

});

f.setVisible(true);//设置是否可见

}
/*
class MyWin implements WindowListener
{
//继承此接口需要覆盖7个方法,可是我们只用到了关闭动作。
//其他动作都没有用到
}

因为WindowListener的子类WindowAdapter已经实现了WindowListener接口。
并覆盖了其中的所有方法,那么我们 只要继承自WindowAdapter覆盖我需要的方法即可
*/

public static void sop(Object obj)
{
System.out.println(obj);
}
}

class MyWin extends WindowAdapter//触发器类
{
public void windowClosing(WindowEvent e)
{
System.out.println("window closing"+e.toString());
System.exit(0);

}
}</span>


/*上段程序的优化及按钮的Action事件*/

<span style="font-family:KaiTi_GB2312;font-size:18px;color:#333333;">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");
//将组件添加到frame中
f.add(but);

//加载一下窗体上事件
myEvent();
//显示窗体
f.setVisible(true);
}

private  void myEvent()//最好要把所有要加载的事件放在一个方法中
{
f.addWindowListener(

new WindowAdapter()
{

public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}

);

//参照窗体事件的过程,写出按钮的事件过程。

but.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)//添加对应事件
{
sop("按钮干的");
System.exit(0);
}

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

public static void sop(Object obj)
{
System.out.println(obj);
}
}
</span>


/*GUI-鼠标事件*/

<span style="font-family:KaiTi_GB2312;font-size:18px;color:#333333;">import java.awt.*;
import java.awt.event.*;
class FrameDemo
{

private Frame f;
private Button but;
private TextField tf;

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

f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());

tf=new TextField(10);//初始化带列数
but=new Button("my button");

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

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_0 && code<=KeyEvent.VK_9))
{sop(code+"...是非法数据");
e.consume();//该方法使得:不会用默认的处理方式处理这个事件。
//也就是,原来是让非数字的输入进入到文本框,现在不允许他进入

}
}

});
but.addActionListener(new ActionListener()//按钮的活动监听

{
public void actionPerformed(ActionEvent e)
{
sop("action ok");
}

});
but.addMouseListener(new MouseAdapter()//在按钮上添加鼠标监听
{

private int count=1;
private int clickCount=1;

public void mouseEntered(MouseEvent e)
{
sop("鼠标进入到该组件"+count++);
}
public void mouseClicked(MouseEvent e)
{
if(e.getClickCount()==2)
sop("双击动作"+clickCount++);

}
});
but.addKeyListener(new KeyAdapter(){//键盘事件
public void keyPressed(KeyEvent e)
{
/*
KeyText(e.getKeyCode()):根据键的码获得键的符号。
sop(KeyEvent.getKeyText(e.getKeyCode())+"::"+e.getKeyCode());
if(e.getKeyCode()==KeyEvent.VK_ENTER)//按下回车键退出
System.exit(0);
*/

//如果control键被按下,再按回车的组合键,打印。
if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
sop("ctrl+enter is run");

}
});
}

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

public static void sop(Object obj)
{
System.out.println(obj);
}
}
</span>


/*小练习:

文本框输入路径,通过转到按钮,内容显示到文本区域中。

*/

<span style="font-family:KaiTi_GB2312;font-size:18px;color:#333333;">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);//15行40列

d=new Dialog(f,"提示信息-self",true);//对话框初始化,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()
{

f.addWindowListener(new WindowAdapter()//窗体关闭
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}

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

});//回车充当转到的功能

okBut.addActionListener(new ActionListener()//点击对话框里的ok按钮

{
public void actionPerformed(ActionEvent e)
{
d.setVisible(false);
}
});

but.addActionListener(new ActionListener()//转到按钮

{
public void actionPerformed(ActionEvent e)
{
showDir();
}
});
}

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");//将遍历的文件追加到文本区域
}
}

//	tf.setText("");
else
{
String info=("你输入的信息"+dirPath+"是错误的,请重新输入");

lab.setText(info);
d.setVisible(true);
}
}

public static void sop(Object obj)
{
System.out.println(obj);
}

public static void main(String[] args)
{
new MyWindowDemo();
}
}</span>


/*GUI-菜单*/

<span style="font-family:KaiTi_GB2312;font-size:18px;color:#333333;">import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class MyMenuDemo
{
private Frame f;
private MenuBar mb;//菜单栏
private Menu m,subMenu;//菜单
private MenuItem closeItem,subItem,openItem,saveItem;//菜单项
private FileDialog openDia,saveDia;
private TextArea ta;

private File file;

MyMenuDemo()
{
init();
}
public void init()
{
f=new Frame("my windwo");
f.setBounds(300,100,650,600);
//f.setLayout(new FlowLayout());//不设置布局,默认为边界布局,让文本区域随着窗口走

mb=new MenuBar();
ta=new TextArea();
m=new Menu("文件");
subItem=new MenuItem("子条目");

openItem=new MenuItem("打开");
saveItem=new MenuItem("保存");
subMenu=new Menu("子菜单");
closeItem=new MenuItem("退出");

openDia=new FileDialog(f,"我要打开",FileDialog.LOAD);
saveDia=new FileDialog(f,"我要保存",FileDialog.SAVE);

f.setMenuBar(mb);//注意此处是set不是add
mb.add(m);
m.add(subMenu);
subMenu.add(subItem);
m.add(openItem);
m.add(saveItem);
m.add(closeItem);

f.add(ta);

myEvent();

f.setVisible(true);

}

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

});
openItem.addActionListener(new ActionListener()//打开菜单项
{
public void actionPerformed(ActionEvent e)
{
openDia.setVisible(true);
//怎么知道你选的哪个文件?去dialog类找方法。
String dirPath=openDia.getDirectory();
String fileName=openDia.getFile();
sop(dirPath+".."+fileName);

if(dirPath==null||fileName==null)
return;

ta.setText("");//当选取有效文件时,清空文本区域
//封装对象
File file=new File(dirPath,fileName);//据路径名和名字创建一个新 File 实例。

try
{
BufferedReader bufr=new BufferedReader(new FileReader(file));

String line=null;
while((line=bufr.readLine())!=null)
{

ta.append(line+"\r\n");
}
}
catch (IOException ex)
{
throw new RuntimeException("读取失败");
}

}
});
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.close();
}
catch (IOException ey)
{
throw new RuntimeException("");
}

}
});

closeItem.addActionListener(new ActionListener()//关闭菜单项

{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
}

public static void main(String[] args)
{
new MyMenuDemo();
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}</span>


将程序做成可执行文件:jar包双击执行

1.在程序内声明包:如:package mymenu;

2.带包编译(指定包存放的路径):javac -d f:\Source2 MyMenuDemo.java

3.新建文本文件写入jar包的配置清单(指定主类):Main-Class: mymenu.MyMenuDemo

注意:此为固定格式:冒号后加空格,包名.类名 回车

3.将包打成jar包:jar -cvfm my.jar 1.txt mymenu

格式: m是包含指定清单(新建文本文件)。

jar -cvfm jar包名.jar 新建文本名.txt 包名(要压缩的包)

在xp下打开jar文件:

话框上部:工具-文件夹选项-文件类型-找到jar类型(也可新建)-高级-

操作:Open

用于执行的程序:浏览-jdk-bin-javaw.exe,然后在后面加上-jar

在win7下打开jar文件:

1.右击jar包,打开方式->选择默认程序->浏览,选中jre下bin文件中javaw.exe

(比如我的javaw.exe在D:\Program Files\Java\jre6\bin下)。

2、regedit编辑注册表:HKEY_CLASSES_ROOT\Applications\javaw.exe\shell\open\command,

修改数据数值为"D:\Program Files\Java\jdk1.6.0_21\jre\bin\javaw.exe" -jar "%1"(只要在原来的数值下添加-jar即可)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: