1、GUI,图像用户接口,是与命令行的交互模式相区别的。
2、java中有两个GUI的包,一个是java.Awt,另一个是javax.Swing.
3、java.Awt比较依赖于平台,意思是说,用该包做出来的界面风格与操作系统平台是有关系的,windows下和linux下是有些细微差别的,属于重量级组件,而javax.Swing包做出的界面什么样的就是什么样,不会随着操作系统平台的不同而不同,属于轻量级组件。
4、AWT包中主要类的层级关系:
Component
|---Container
|---Window
|---Frame
|---Dialog
|---FileDialog
|---Panel
|---Button
|---Checkbox
|---Label
|---TextComponent
|---TextField
|---TextArea
5、Container作为一个组件,本身也可以通过add方法添加组件。
6、布局管理器有:流式布局,边界式布局,网格布局,网格包式布局,卡片式布局,坐标式布局。
7、一个窗体可以使用多个形式的布局管理器,这可以通过面板(Panel)实现,每个面板可以使用一种布局管理器。
8、事件监听机制:
a):事件源
b):事件
c):监听器
d):事件处理
9、监听器结尾都是listener。
10、窗体事件----关闭
Frame f = new Frame("myFrameDemo");
f.setLocation(300,200);
f.setSize(500,400);
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
f.setVisible(true);
11、窗口监听器WindowListener 的方法windowActivated,在被操作窗口处于最前端时即被调用;而方法windowOpened方法是在被操作窗口刚被打开时会被调用。
12、给某按钮添加监听器
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class FrameButtonDemo {
/**
*该程序的写法把图形用户组件的操作放在了init()方法中,把事件写在了myEvent方法中
*这种分开的写法可以使程序看起来更有条理性。
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new FrameButton();
}
}
class FrameButton
{
private Frame f;
private Button b;
FrameButton()
{
init();
}
void init()
{
f = new Frame("My Frame");
f.setBounds(300,100,500,400);
f.setLayout(new FlowLayout());
b = new Button("按钮1");
f.add(b);
myEvent();
f.setVisible(true);
}
void myEvent()
{
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println(e.toString());
System.exit(0);
}
});
}
}
13、给按钮添加活动监听器ActionListener和给按钮添加鼠标事件监听器MouseListener,事件触发监听器时,后者的处理函数先被执行。示例如下:
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println("action");
}
});
b.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
System.out.println("mouse");
}
});
打印结果是mouse(换行)action
14、鼠标双击事件捕获并处理
b.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
//间隔较短的双击可被捕获,间隔较大的双击(可视为两次独立的单击)则不能被捕获
//这说明双击和两次单击是有点儿区别的。
if( e.getClickCount() == 2 )
System.out.println("双击被捕获");
}
});
15、
b.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
//某个键的名字是单个字符时,可以通过KeyEvent类中的getKeyChar方法获取
System.out.println(e.getKeyChar()+"..."+e.getKeyCode());
//某个键的名字是多个字符时就要通过getKeyText方法获取键名
System.out.println(KeyEvent.getKeyText(e.getKeyCode()));
}
});
16、视频中的例题
import java.awt.Button;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
public class TextDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
new FrameText();
}
}
class FrameText
{
private Frame f;
private TextField tf;
private TextArea ta;
private Button b;
FrameText()
{
init();
}
void init()
{
f = new Frame("TextFrameDemo");
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
tf = new TextField(40);
b = new Button("转到");
ta = new TextArea(25,70);
f.add(tf);
f.add(b);
f.add(ta);
myEvent();
f.setVisible(true);
}
private void myEvent()
{
//窗体事件---关闭
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//鼠标事件---按下
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String strTemp = tf.getText();
File file = new File(strTemp);
ta.setText("");
if( file.exists() )
{
if( !file.isDirectory() )
ta.append(f.toString()+"\r\n");
else
process(file,0);
tf.setText("");
}
else
{
final Dialog d = new Dialog(f,"提示信息",true);
Label l = new Label("输入地址:"+strTemp+"错误!");
Button okb = new Button("确定");
d.setBounds(300,100,240,160);
d.setLayout(new FlowLayout());
d.add(l);
d.add(okb);
d.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
{
d.setVisible(false);
}
});
okb.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
d.setVisible(false);
}
});
d.setVisible(true);
}
}
});
}
private void process(File dir,int level)
{
File[] files = dir.listFiles();
ta.append(printBlank(level)+dir.getName()+"\r\n");
level++;
for( File file : files )
{
if( file.isDirectory() )
{
process(file,level);
}
else
{
ta.append(printBlank(level)+file.getName()+"\r\n");
}
}
}
private String printBlank(int level)
{
StringBuilder sb = new StringBuilder();
for( int i = 0; i < level; i++ )
sb.append(" ");
sb.append("|---");
return sb.toString();
}
}
17、给一个窗体添加菜单
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class FrameMenuDemo {
public static void main(String[] args) {
new FrameMenu();
}
}
class FrameMenu
{
private Frame f;
private MenuBar mb;
private Menu m;
private Menu mi0;
private MenuItem mi1;
private MenuItem m1;
FrameMenu()
{
init();
}
void init()
{
f = new Frame("MyFrameMenu");
f.setBounds(300,100,500,400);
f.setLayout(new FlowLayout());
mb = new MenuBar();
m = new Menu("文件");
mi0 = new Menu("子菜单");
mi1 = new MenuItem("退出");
m1 = new MenuItem("子条目");
mb.add(m);
m.add(mi0);
m.add(mi1);
mi0.add(m1);
f.setMenuBar(mb);
myEvent();
f.setVisible(true);
}
void myEvent()
{
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
mi1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
}
}