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。