GraphicalUser Interface:图形用户接口。AWT:抽象窗口接口,调用系统方法实现;Swing:图形界面组件系统,Java自身实现。
一. AWT的继承关系:
二. 常用布局管理器:
FlowLayout(流布局)
从左到右的顺序排列,单个组件默认居中。Panel默认此布局
BorderLayout(边界布局)
东西南北中,当不指定方位时,默认最大化填充。Frame默认此布局
GridLayout(网格布局)
规则布局
GardLayout(卡片布局)
选项卡
GridBagLayout(网格包布局)
非规则矩阵
三. 界面创建流程:
1)创建容器
Window、Frame、Panel . . .
2)设置容器属性
宽、高、位置、颜色、布局、可见 . . .
3)添加组件
按钮、标签、文本框 . . .
4)添加事件监听
事件源、事件、监听器、处理办法 . . .
1. 示例:
import java.awt.*;
import java.awt.event.*;
class AwtDemo
{
public static void main(String[] args)
{
//--------------------------------------------1
//顶层容器:框架
Frame f=new Frame("FirstAWT");
//--------------------------------------------2
f.setSize(400, 300); //大小
f.setLocation(300, 200); //位置
f.setVisible(true); //可见
//Frame默认是边界布局,改为流布局
f.setLayout(new FlowLayout());
//--------------------------------------------3
Button b=new Button("This isa button");
f.add(b); //在框架上添加按钮
//--------------------------------------------4
f.addWindowListener(newMyEvent());
}
}
//窗口关闭处理
class MyEvent extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.out.println(e.toString());
System.exit(0);
}
}
2. 界面与事件分离:
import java.awt.*;
import java.awt.event.*;
class AwtDemo
{
private Frame f;
private Button b;
AwtDemo()
{
init(); //创建界面
event(); //添加事件处理
}
public void init()
{
f=new Frame("FirstAWT");
f.setSize(400, 300);
f.setLocation(300, 200);
f.setLayout(new FlowLayout());
f.setVisible(true);
b=new Button("This is a exitbutton");
f.add(b);
}
public void event()
{
f.addWindowListener(new WindowAdapter() //窗体事件监听
{
public void windowClosing(WindowEvent e)
{
System.out.println(e.toString());
System.exit(0);
}
});
b.addActionListener(new ActionListener() //动作事件监听
{
public void actionPerformed(ActionEvent e)
{
System.out.println("点击按钮退出");
System.exit(0);
}
});
}
public static void main(String[] args)
{
new AwtDemo();
}
}
四. 按钮事件:
import java.awt.*;
import java.awt.event.*;
class AwtDemo
{
private Frame f;
private Button b;
AwtDemo()
{
init();
}
public void init()
{
f=new Frame("FirstAWT");
f.setSize(400, 300);
f.setLocation(300, 200);
f.setVisible(true);
f.setLayout(new FlowLayout());
b=new Button("This is a exitbutton");
f.add(b);
event();
}
public void event()
{
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvente)
{
System.exit(0);
}
});
//动作(状态)触发事件
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println("按钮被触发动作"+e.toString());
}
});
//鼠标触发事件
b.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
System.out.println("鼠标点击:"+e.toString());
if(e.getClickCount()==2)
{
System.out.println("双击事件");
}
if(e.getClickCount()==3)
{
System.out.println("三击事件");
}
}
public voidmouseEntered(MouseEvent e)
{
//System.out.println("鼠标移到:"+e.toString());
}
});
//键盘触发事件
b.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
System.out.println("按下键:"+e.getKeyChar()+",对应ASCII码:"+e.getKeyCode()+",字符串表示:"+KeyEvent.getKeyText(e.getKeyCode()));
if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_ENTER)
{
System.out.println("ctrlis down , and enter is down.");
}
}
});
}
public static void main(String[] args)
{
new AwtDemo();
}
}
五. 事件处理示例:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class AwtDemo
{
private Button btnSend; //按钮-发送
private Button btnClose; //按钮-关闭
private Dialog dlgWarning; //对话框-错误警告
private Frame frame; //窗体
private Label label; //标签
private Menu menuEdit; //菜单-编辑
private Menu menuFile; //菜单-文件
private Menu menuNew; //菜单-新建
private MenuBar menuBar; //菜单栏
private MenuItem menuItemExit; //菜单项-退出
private MenuItem menuItemCpp; //菜单项-Cpp
private MenuItem menuItemJava; //菜单项-Java
private TextArea textArea; //文本域
private TextField textField; //文本框
AwtDemo()
{
init();
}
public void init()
{
btnSend=new Button("按钮");
textArea=new TextArea(25, 70);
textField=new TextField(60);
menuItemExit=new MenuItem(" 退出 ");
menuItemCpp=newMenuItem("C++");
menuItemJava=newMenuItem("Java");
menuNew=new Menu(" 新建 ");
menuNew.add(menuItemCpp);
menuNew.add(menuItemJava);
menuFile=new Menu(" 文件 ");
menuFile.add(menuNew);
menuFile.add(menuItemExit);
menuEdit=new Menu(" 编辑 ");
menuBar=new MenuBar();
menuBar.add(menuFile);
menuBar.add(menuEdit);
frame=new Frame("FirstAWT");
frame.setBounds(200, 100, 600,500); //x,y,w,h
frame.setLayout(new FlowLayout());
frame.add(textField);
frame.add(btnSend);
frame.add(textArea);
frame.setMenuBar(menuBar);
btnClose=new Button("关闭提示");
label=new Label();
dlgWarning=new Dialog(frame,"提示:", true);
dlgWarning.setBounds(200, 100,300, 200);
dlgWarning.setLayout(newFlowLayout());
dlgWarning.add(label);
dlgWarning.add(btnClose);
event();
frame.setVisible(true);
}
public void event()
{
frame.addWindowListener(new WindowAdapter() //窗体退出事件
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
btnSend.addActionListener(new ActionListener() //发送按钮触发事件
{
public void actionPerformed(ActionEvent e)
{
showDir();
}
});
menuItemExit.addActionListener(new ActionListener() //退出菜单触发事件
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
btnSend.addMouseListener(new MouseAdapter() //发送按钮鼠标点击事件
{
public void mouseClicked(MouseEvent e)
{
showDir();
}
});
btnSend.addKeyListener(new KeyAdapter() //发送按钮键盘按下事件
{
public voidkeyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_ENTER)
{
showDir();
}
}
});
btnClose.addMouseListener(new MouseAdapter() //关闭按钮鼠标点击事件
{
public void mouseClicked(MouseEvent e)
{
dlgWarning.setVisible(false);
}
});
dlgWarning.addWindowListener(new WindowAdapter() //对话框关闭事件
{
public void windowClosing(WindowEvent e)
{
dlgWarning.setVisible(false);
}
});
textField.addKeyListener(new KeyAdapter() //文本框键盘按下事件
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_ENTER)
{
showDir();
}
}
});
}
public void showDir()
{
String s1=textField.getText();
File dir=new File(s1);
if (dir.exists() && dir.isDirectory())
{
textArea.setText("");
String[] names=dir.list();
for (String name:names)
{
textArea.append(name+"\r\n");
}
}
else
{
String s2="路径错误!";
label.setText(s2);
dlgWarning.setVisible(true);
}
textField.setText("");
}
public static void main(String[] args)
{
new AwtDemo();
}
}
六. 我的记事本:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class AwtDemo
{
private File file; //文件操作类
private FileDialog fileDialogSave; //文件选择对话框-保存
private FileDialog fileDialogOpen; //文件选择对话框-打开
private Frame frame; //窗体
private Menu menuEdit; //菜单-编辑
private Menu menuFile; //菜单-文件
private Menu menuNew; //子菜单-新建
private MenuBar menuBar; //菜单栏
private MenuItem menuItemExit; //菜单项-退出
private MenuItem menuItemCpp; //菜单项-Cpp
private MenuItem menuItemJava; //菜单项-Java
private MenuItem menuItemOpen; //菜单项-打开
private MenuItem menuItemSave; //菜单项-保存
private TextArea textArea; //文本域
AwtDemo()
{
init(); //初始化
}
public void init()
{
//菜单项
menuItemExit=new MenuItem(" 退 出 ");
menuItemCpp=new MenuItem("C++");
menuItemJava=new MenuItem("Java");
menuItemOpen=new MenuItem(" 打 开 ");
menuItemSave=new MenuItem(" 保 存 ");
//子菜单
menuNew=new Menu(" 新 建 ");
menuNew.add(menuItemCpp);
menuNew.add(menuItemJava);
//菜单
menuFile=new Menu(" 文 件 ");
menuFile.add(menuItemOpen);
menuFile.add(menuItemSave);
menuFile.add(menuNew);
menuFile.add(menuItemExit);
//菜单
menuEdit=new Menu(" 编 辑 ");
//菜单栏
menuBar=new MenuBar();
menuBar.add(menuFile);
menuBar.add(menuEdit);
//文本域
textArea=new TextArea();
//窗体
frame=new Frame("我的记事本");
frame.setBounds(200, 100, 600, 500); //x,y,w,h
//frame.setLayout(new FlowLayout()); //默认边界布局,TextArea随窗体大小填充
//添加菜单栏
frame.setMenuBar(menuBar);
frame.add(textArea);
//文件选择窗口
fileDialogSave=new FileDialog(frame, "我要保存", FileDialog.SAVE);
fileDialogOpen=new FileDialog(frame, "我要打开", FileDialog.LOAD);
//事件处理
event();
frame.setVisible(true);
}
public void event()
{
frame.addWindowListener(new WindowAdapter() //窗体退出事件
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
menuItemOpen.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
fileDialogOpen.setVisible(true);
String filePath=fileDialogOpen.getDirectory();
String fileName=fileDialogOpen.getFile();
if(filePath==null || fileName==null)
return;
textArea.setText("");
File file=new File(filePath, fileName);
try
{
BufferedReader bufr=new BufferedReader(new FileReader(file));
String line=null;
while ((line=bufr.readLine())!=null)
{
textArea.append(line+"\r\n");
}
bufr.close();
}
catch (IOException ioe)
{
throw new RuntimeException("读取失败");
}
}
});
menuItemSave.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if (file==null)
{
fileDialogSave.setVisible(true);
String filePath=fileDialogSave.getDirectory();
String fileName=fileDialogSave.getFile();
if (filePath==null || fileName==null)
return;
file=new File(filePath, fileName);
}
try
{
BufferedWriter bufw=new BufferedWriter(new FileWriter(file));
String text=textArea.getText();
bufw.write(text);
bufw.close();
}
catch (IOException ioe)
{
throw new RuntimeException();
}
}
});
menuItemExit.addActionListener(new ActionListener() //退出菜单触发事件
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
}
public static void main(String[] args)
{
new AwtDemo();
}
}
七. Swing:
Swing是纯Java组件,可在不同的平台上实现相同的外观和行为。组件都在javax.swing包中。
我的图片查看器示例:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
class SwingDemo
{
private JFrame frame; //窗体
private JMenuBar menuBar; //菜单栏
private JMenu mnuFile; //文件菜单
private JMenuItem mnuOpen; //打开项
private JMenuItem mnuClose; //关闭项
private JMenuItem mnuExit; //退出项
private JMenu mnuEdit; //编辑菜单
private JMenuItem mnuCopy; //复制项
private JMenuItem mnuMove; //剪切项
private JMenu mnuHelp; //帮助菜单
private JMenu mnuContact; //联络
private JMenuItem mnuWeb; //网站
private JMenuItem mnuEmail; //邮箱
private JMenuItem mnuAbout; //关于
private JPanel panel; //菜单栏+工具栏
private JToolBar toolBar; //工具栏
private JButton btnOpen; //打开
private JButton btnCopy; //复制
private JFileChooser fileChooser; //文件选择器
private JLabel label; //图片显示
private JDialog dlgAbout;
SwingDemo()
{
init();
}
public static void main(String[] args)
{
new SwingDemo();
}
/**
*初始化界面
*/
public void init()
{
mnuOpen=new JMenuItem(" 打 开 ..."); //打开项
mnuClose=new JMenuItem(" 关 闭 "); //关闭项
mnuExit=new JMenuItem(" 退 出 "); //退出项
mnuFile=new JMenu(" 文 件 "); //文件菜单
mnuFile.add(mnuOpen);
mnuFile.add(mnuClose);
mnuFile.addSeparator(); //分隔线
mnuFile.add(mnuExit);
mnuCopy=new JMenuItem(" 复 制 "); //复制项
mnuMove=new JMenuItem(" 剪 切 "); //剪切项
mnuEdit=new JMenu(" 编 辑 "); //编辑菜单
mnuEdit.add(mnuCopy);
mnuEdit.add(mnuMove);
mnuWeb=new JMenuItem("网站"); //网站
mnuEmail=new JMenuItem("邮箱"); //邮箱
mnuContact=new JMenu("联系方式"); //联络
mnuContact.add(mnuWeb);
mnuContact.add(mnuEmail);
mnuAbout=new JMenuItem("关于本软件"); //关于
mnuHelp=new JMenu(" 帮 助 "); //帮助菜单
mnuHelp.add(mnuContact);
mnuHelp.add(mnuAbout);
menuBar=new JMenuBar(); //菜单栏
menuBar.add(mnuFile);
menuBar.add(mnuEdit);
menuBar.add(mnuHelp);
btnOpen=new JButton(); //打开工具
btnOpen.setIcon(new ImageIcon("e:/ico_o.png")); //图标
btnOpen.setToolTipText("打开"); //提示
btnCopy=new JButton(); //复制工具
btnCopy.setIcon(new ImageIcon("e:/ico_c.png"));
btnCopy.setToolTipText("复制");
toolBar=new JToolBar(); //工具栏
toolBar.setFloatable(false); //锁定
toolBar.add(btnOpen);
toolBar.add(btnCopy);
panel=new JPanel(); //菜单栏和工具栏
panel.setLayout(new BorderLayout());
panel.add(menuBar, BorderLayout.NORTH);
panel.add(toolBar);
label=new JLabel();
String title="我的图片查看器"; //窗体标题
frame=new JFrame(title);
frame.setBounds(200, 100, 500, 450); //x,y,w,h
frame.setLayout(new BorderLayout());
frame.add(panel, BorderLayout.NORTH);
frame.add(label, BorderLayout.CENTER);
fileChooser=new JFileChooser();
event();
frame.setVisible(true); //显示窗体
}
/**
*事件处理
*/
public void event()
{
//窗体的关闭按钮
frame.setDefaultCloseOperation(3); //"EXIT_ON_CLOSE",点击关闭按钮程序退出
//文件菜单下的“打开”项
mnuOpen.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
selectPic();
}
});
//文件菜单下的“关闭”项
mnuClose.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if (label.getIcon()!=null)
{
label.setIcon(null);
}
}
});
//文件菜单下的“退出”项
mnuExit.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
//帮助菜单下的“关于”项
mnuAbout.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
dlgAbout=new JDialog(frame, "关于“我的图片查看器”");
dlgAbout.setBounds(300, 300, 350, 300);
JLabel lblAbout=new JLabel("第一个SWing软件哦");
dlgAbout.add(lblAbout);
dlgAbout.setVisible(true);
}
});
//
btnOpen.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
selectPic();
}
});
}
private void selectPic()
{
fileChooser.setFileFilter(new FileNameExtensionFilter("JPG文件", "jpg"));
fileChooser.showOpenDialog(frame);
File file=fileChooser.getSelectedFile();
label.setIcon(new ImageIcon(file.toString())); //并非直接显示图片,而是作为图标
}
}