------- android培训、java培训、期待与您交流! ----------
GUI图形用户接口:
|----全称:Graphical User Inteface.与之相对的是命令行用户接口CLI(Command line User Interface)
|----对象包:java.Awt与java.Swing
|----Awt( Abstract Window ToolKit )依赖于本地系统,属于重量级控件。
|----Swing,在Awt的基础上,增加了更多的组件,而且完全由java实现,增加了可移植性。
|----布局:
容器(Container)中的组件排列方式就是布局.
常见的布局管理器:
|----流式布局(Flow Layout)从左到右的顺序排列。pannel默认的布局管理器。
|----边界布局( Border Layout )东南西北中.Frame默认的布局管理器。没有指定边界布局的东南西北,默认居中填充。
public class buttonDir extends Applet {
public void init() {
setLayout(new BorderLayout());
add(new Button("North"), BorderLayout.NORTH);
add(new Button("South"), BorderLayout.SOUTH);
add(new Button("East"), BorderLayout.EAST);
add(new Button("West"), BorderLayout.WEST);
add(new Button("Center"), BorderLayout.CENTER);
}
}
|----GridLayout网格布局。规则的矩阵。
|----GridBagLayout网格包。不规则的矩阵。
|----CardLayout卡片布局管理器。
如果在一个容器中存在两种布局,则将容器划分成一块一块的面板,在面板中设置不同的布局。
|----Frame
|----图形化界面由另一个线程来控制,与主线程分开。
|----创建图形化界面的步骤:
1.创建frame窗体。new Frame( "title" )
2.对窗体进行基本设置。如大小,位置,颜色。setSize( 横坐标,纵坐标 ),setLocation( 横,纵 )。f.setBounds( 300, 100, 500, 400 );
3.定义组件,如new Button( "我是一个按钮" )
4.将组件通过add方法添加到容器中。(容器运用了集合)
5.让窗体显示,通过setVisible( true )
|----事件监听机制
|----1.事件源。---按钮.窗体
2.事件。---单击动作按钮,alt+f4
3.监听器。---比如对窗口产生的动作,关闭窗口(点叉号或者alt+f4),窗口前置(Activated)这些结果都是通过事件所引发的
4.事件处理。---对事件产生的结果进行处理,比如单击X事件,在监听器中产生关闭窗口的结果,然后就要在关闭窗口的方法中进行处理System.exit(0);
事件源:就是awt和swing包中的那些图形界面组件
事件:每一个事件源都有自己特有的对应事件和共性事件。
监听器:可以将触发某一个事件的动作(不止一个动作)都已经封装到了监听器中。
以上三者都在java中定义了,直接获取对象就可以。
我们要做的就是对产生的动作进行处理
|----适配器Adapter
因为监听器都是一些接口,每次要使用监听器都要将方法复写一边很麻烦,因此就产生了适配器
他将接口中的方法都实现了,但是都是空。如果用适配器则用到哪个方法就复写哪一个方法
public abstract class WindowAdapter
适配器要写成抽象类是为了不让用户建立对象
|----具体例子:
import java.awt.*;
import java.awt.event.*;//这个事件包要导入
class AwtDemo
{
public static void main(String[] args)
{
Frame f = new Frame( "我的窗口" );
f.setSize( 500, 400 );
f.setLocation( 300, 200 );
f.setLayout( new FlowLayout() );
Button b = new Button( "按钮" );
f.add( b );
f.addWindowListener( new MyWindowAdapter() );//使用**窗口的** addWindowListener 方法将从该类所创建的侦听器对象向该 Window 注册。
//当通过打开、关闭、激活或停用、图标化或取消图标化而改变了窗口状态时,将调用该侦听器对象中的相关方法,
//并将 WindowEvent 传递给该方法。
f.setVisible( true );
System.out.println("Hello World!");
}
}
class MyWindowAdapter extends WindowAdapter
{
public void windowClosing( WindowEvent e )//事件处理
{
System.out.println( "窗口关闭" );
System.exit( 0 );
}
public void windowActivated(WindowEvent e)
{
System.out.println( "窗口前置" );
}
public void windowOpened(WindowEvent e)
{
System.out.println( "窗口打开" );//在窗口被打开时,这里可以做一些处理
}
}
|----Action事件
ActionListener是少数几个没有适配器(Adapter)的监听器,他只有一个方法,所以不需要适配器。超过2个方法的监听器就有适配器。
private void myEvent()//整个框架中每个事件源进行监听器注册
{
f.addWindowListener( new WindowAdapter()
{
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
});
but.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)//发生操作时调用,比如点击了按钮就算发生操作
{
System.out.println( "退出,按钮干的" );
System.exit( 0 );
}
});
}
|----鼠标动作
|---but按钮上有两个监听器,点击鼠标先执行鼠标点击事件处理,在执行Action事件处理,因为鼠标单击更具体
but.addMouseListener( new MouseAdapter()
{
private int count;
private int mouseCount;
public void mouseClicked(MouseEvent e)
{
if( e.getClickCount() == 2 )
{
System.out.println( "鼠标双击" );
}
//System.out.println( "退出,鼠标单击" + count++ );
//System.exit( 0 );
}
public void mouseEntered(MouseEvent e)
{
System.out.println( "鼠标进入"+ mouseCount++ );
}
});
|----键盘动作
//添加键盘监听器
but.addKeyListener( new KeyAdapter()
{
public void keyPressed( KeyEvent e )//键盘按下,即输入字符或者字符串
{
//System.out.println( KeyEvent.getKeyText( e.getKeyCode() ) + "..."+e.getKeyCode() );
//public boolean isControlDown() 为一些组合键提供的函数还有Shift Alt 等等。在 java.awt.event.InputEvent包中
if( e.getKeyCode() == KeyEvent.VK_ENTER && e.isControlDown() )//QQ发送消息的快捷键
{
System.out.println( "ctrl+entry" );
}
}
} );
//为文本框添加监听器。
//事件源上操作的不一定是自己。比如按钮接收单击事件,但是单击操作打印的是文本框中的内容
text.addKeyListener( new KeyAdapter()
{
public void keyPressed( KeyEvent e )
{
int num = e.getKeyCode();
if( !(num <= KeyEvent.VK_9 && num >= KeyEvent.VK_0) )
{
System.out.println( "输入非法字符" );
e.consume();//不会按照默认的方式由产生此事件的源代码来处理此事件。
}=-
}
} );
|----练习:列出指定目录内容
class MyWindow
{
private Frame f;
private Button but;
private TextField tf;
private TextArea ta;
MyWindow()
{
init();
}
private void init()
{
f = new Frame( "窗口" );
f.setBounds( 300, 100, 600, 500 );
f.setLayout( new FlowLayout() );
tf = new TextField( 60 );
f.add( tf );
but = new Button( "转到" );
f.add( but );
ta = new TextArea( 25, 70 );
f.add( ta );
f.setVisible( true );
//myEvent();
}
public void myEvent()
{
f.addWindowListener( new WindowAdapter()
{
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
} );
but.addActionListener( new ActionListener()
{
public void actionPerformed( ActionEvent e )
{
//得到文件目录的字符串
String dirPath = tf.getText();
//将文件目录封装成一个文件对象
File dir = new File( dirPath );
if( dir.exists() && dir.isDirectory() )
{
String[] names = dir.list();
//将文本区原来的内容清空
ta.setText( "" );
for( String name: names )
{
ta.append( name+"\r\n" );
}
}
}
});
}
public static void main(String[] args)
{
//myEvent();无法在静态方法中引用非静态方法,非静态方法依赖于对象存在
//可以将myEvent写入到初始化函数中或者这样
new MyWindow().myEvent();
}
}
|----对话框Dialog
|----Dialog一般不自己单独存在,依赖于窗口或者其他组件,因此他的构造函数是其他组件的实例
Dialog(Frame f, String title, boolean modal) 第三个参数为true则不关闭当前对话框则
不能修改Frame的内容
|----对话框中如果有Label标签,那么需要在d.setVisible()之前设置标签文字,否则不会显示。在Frame中setVisible
不需要限定位置,只要保证放在f 有具体引用(即不能时空指针)即可。
setVisible();之后在注册的事件注册不上,执行到这个语句会发生线程阻塞
|---- private void myEvent()
{
but.addActionListener( new ActionListener()
{
public void actionPerformed( ActionEvent e )
{
String dir = tf.getText();
File dirpath = new File( dir );
if( dirpath.exists() && dirpath.isDirectory() )
{
String[] names = dirpath.list();
for( String name : names )
{
ta.append( name+"\r\n" );
}
}
else
{
final Dialog d = new Dialog( f, "提示", true );
Button butok = new Button( "确定" );
Label lab = new Label( dir+"不存在" );
d.setBounds( 350, 150, 200, 120 );
d.setLayout( new FlowLayout() );
d.add( butok );
d.add( lab );
//d.setVisible( true );这行应该放在所有事件注册完毕之后。不然后面事件监听注册不上,注册不上因为运行到这里线程阻塞
//Dialog的第三个参数就是设置模态对话框,如果是模态Modal Dialogue Box模态对话框显示后,父对话框时要等待模态对话框响应完成了才会继续执行的。
butok.addActionListener( new ActionListener()
{
public void actionPerformed( ActionEvent e )
{
d.setVisible( false );
}
});
d.addWindowListener( new WindowAdapter()
{
public void windowClosing( WindowEvent e )
{
d.setVisible( false );
}
});
d.setVisible( true );
}
}
应该是final Dialog d = new Dialog(f, "提示", true);这一行的原因。你的Dialog构造器第3个参数设为false就可以了。
原因是modal为true的Dialog执行setVisible(true)之后线程阻塞,后面的代码要等Dialog关闭之后才会执行。
------- android培训、java培训、期待与您交流! ---------- 详细请查看:http://edu.csdn.net/heima/