黑马程序员——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)中的组件的排放方式,就是布局。
常见的布局管理器:
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)
例:
运行结果:
但是,该窗口没任何动能,连关闭按钮都无法使用。需要添加监听器和事件的处理方式
二、事件监听机制
步骤:
1、确定事件源(容器或组件)
2、通过事件源对象的addXXXListener()方法将侦听器注册到该事件源上。
3、向步骤2的方法中传入相应的参数。
一般为XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。
在实现或者继承时一般用匿名内部类。
然后覆盖方法,方法的参数一般是XXXEvent类型的变量接收。
4、事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponent()获取。
f025
ps:一般接口类XXXListener中的方法大于或等于3个时,就会有相应的适配器类XXXAdapter。XXXAdapter类只是用空方法实现了XXXListener类,所以此时只需继承XXXAdapter类,覆写其中需要的方法即可,不需覆写所有的方法。如WindowListener与WindowAdapter。
例:向窗口和按钮添加关闭功能
共性事件(鼠标键盘的监听)
该监听适用于所有的Component子类,因此注册监听器方法在Component类中。
鼠标监听MouseListener ,可以监听鼠标的进入、离开、单击等事件。其中单击与ActionListener的区别在于ActionListener可以监听来自键盘对按钮的点击。
键盘监听KeyListener,可以监听键盘某个键的按下、释放、键入等。
也可以过滤文本框中键入的值,如:
也可以判断Ctrl+Enter
三、对话框(Dialog)
何时需要产生对话框:此对象时需要在调用时,才创建对象。如:当在误操作的时候,就需要出现提示错误信息的对话框,此时才创建的这个对象。
其中一个构造函数
构造一个最初不可见的 Dialog,它带有指定的所有者 Frame、标题和模式。
若modal为true时,Dialog显示 Frame不可操做
其他操作与Frame类似。
例:对列出指定目录内容示例的功能增强。
四、菜单
三个常用组件:菜单栏MenuBar 、菜单Menu 、菜单项MenuItem
继承关系:
MenuComponent
|--Menubar
|--MenuItem
|--Menu
菜单的添加:
1、通过调用Frame的setMenuBar()方法,将菜单栏Menubar添加进窗口。
2、在Menubar添加相应的菜单Menu
3、再向Menu中添加菜单项MenuItem或者子菜单。
ps:Menubar中只能添加Menu,不能添加其父类MenuItem。而且同一个MenuItem对象不能同时添加进两个Menu中。
添加事件监听:
菜单项调用方法addActionListener(ActionListener l) 添加,添加方式与按钮中添加ActionListener 一致。
如,向关闭菜单项中添加关闭功能:
例:包含关闭功能的简单菜单窗口
运行结果:
五、打开与保存文件(FileDialog)
FileDialog 是 Dialog的子类,显示一个对话框窗口,用户可以从中选择文件。
使用方法:
1、先构造一个不显示的对话框窗口:
其中mode - 对话框的模式,可以是 FileDialog.LOAD(加载文件) 或 FileDialog.SAVE(保存文件)
2、在需要显示的时候调用 setVisible(true) 弹出窗口。
3、调用方法getDirectory()、 getFile() 获取目标文件的目录及文件名。如果在窗口中没有选择文件,而是选择了取消,则这两个方法的返回值为null
例:在监听器中加入文件对话框操作
练习:完成一个简单的记事本程序。
六、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培训、期待与您交流! ----------
一、基础
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(卡片布局管理器) | 选项卡 |
步骤(以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类,覆写其中需要的方法即可,不需覆写所有的方法。如WindowListener与WindowAdapter。
例:向窗口和按钮添加关闭功能
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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统