AWT菜单:
与创建GUI界面的方式类似,创建AWT菜单就是将菜单条、菜单项和菜单组合在1起。
(1)AWT中的菜单由以下几个类组合而成:
MenuBar 菜单条,菜单的容器
Menu 菜单组件,菜单项的容器
PopupMenu 上下文菜单组件(右键菜单组件)
MenuItem 菜单项组件
CheckboxMenuItem 复选框菜单组件
MenuShortcut 菜单快捷键组件
(2)MenuBar和Menu都实现了菜单容器接口,所以MenuBar可用于艳服Menu,而Menu可用于艳服MenuItem(包括Menu和CheckboxMenuItem两个子类对象),Meun还有1个子类:PopupMenu,代表上下文菜单,上下文菜单无需使用MenuBar艳服。
(3)Menu/MenuItem的构造器都可以接受1个字符串参数,该字符串作为其对应菜单、菜单项上的标签文本。除此以外,MenuItem还可以接受1个MenuShortcut对象,该对象用于指定该菜单的快捷键。MenuShortcut类使用虚拟键代码(而不是字符)来创建快捷键。
例如:Ctrl+A(通常都使用Ctrl键作为快捷键的辅助键)
快捷方式通过以下代码创建
MenuShortcut ms=new MenuShortcut(KeyEvent.VK_A)
如果还需要Shift键的辅助,则可使用以下代码:
MenuShortcut ms=new MenuShortcut(KeyEvent.VK_A,true)
(3)有时候程序还希望对菜单进行分组,将功能类似的菜单分成1组,此时需要使用菜单分隔符。AWT中添加菜单分隔符有以下两种方法
a.调用Menu对象的addSeparator()方法来添加菜单分隔线。
b.使用添加new MenuItem(“-“)的方式添加菜单分隔线。
(4)创建了MenuItem Menu MenuBar 对象以后,调用Menu的add()方法将多个MenuItem组合成菜单(也能够将另外一个Menu菜单组合进来,从而构成2级菜单),在调用MenuBar的add()方法,将多个Menu组合成菜单条,最后调用Frame对象的setMenuBar()方法为该窗口添加菜单条。
实例程序:
package com.zou;
import java.awt.CheckboxMenuItem;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.MenuShortcut;
import java.awt.TextArea;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class SimpleMenu{
Frame f=new Frame("菜单测试");
MenuBar mb=new MenuBar();
Menu file =new Menu("文件");
Menu edit =new Menu("编辑");
MenuItem newItem =new MenuItem("新建");
MenuItem saveItem=new MenuItem("保存");
//创建exitItem菜单项,指定使用Ctrl+x 快捷键
MenuItem exitItem=new MenuItem("退出", new MenuShortcut(KeyEvent.VK_X));
CheckboxMenuItem autoWrap=new CheckboxMenuItem("自动换行");
MenuItem copyItem=new MenuItem("复制");
MenuItem pasteItem=new MenuItem("粘贴");
Menu format=new Menu("格式");
//创建commonItem菜单项,指定使用CtrShift+/ 快捷键
MenuItem commonItem=new MenuItem("注释", new MenuShortcut(KeyEvent.VK_SLASH,true));
MenuItem cancelItem=new MenuItem("取消注释");
TextArea ta=new TextArea(8, 60);
public void init(){
//以lambda表达式创建菜单事项监听器
ActionListener menuListener=e -> {
String cmd =e.getActionCommand();
ta.append("单击"+cmd+"菜单"+"\n");
if(cmd.equals("退出")){
System.exit(0);
}
};
//为commonItem菜单项添加事件监听器
commonItem.addActionListener(menuListener);
exitItem.addActionListener(menuListener);
//为file菜单添加菜单项
file.add(newItem);
file.add(saveItem);
file.add(exitItem);
//为eidt菜单添加菜单项
edit.add(autoWrap);
//使用addSeparator方法添加菜单分割线
edit.addSeparator();
edit.add(copyItem);
edit.add(pasteItem);
//为format菜单添加菜单项
format.add(commonItem);
format.add(cancelItem);
//使用new MenuItem("-")添加菜单分割线
edit.add(new MenuItem("-"));
//将format菜单组合到edit菜单中,从而构成2级菜单
edit.add(format);
//将file edit 菜单加到mb菜单条中
mb.add(edit);
mb.add(file);
//为f窗口设置菜单条
f.setMenuBar(mb);
//以匿名内部类的情势创建监听器对象
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
f.add(ta);
f.pack();
f.setVisible(true);
}
public static void main(String[] args){
new SimpleMenu().init();
}
}
AWT菜单组件不能创建图标菜单,如果希望创建带图标的菜单,则应当使用Swing的菜单组件:JMenuBar,JMenu JMenuItem JpopupMenu Swing的菜单组件和AWT菜单组件基本类似。
——————————————————————————————————————————————————————————————————————–
右键菜单:
(1)右键菜单使用PopupMenu对象表示,创建右键菜单步骤以下:
创建PopupMenu的实例
创建多个menuItem实例,顺次将这些实例加入PopupMenu中
将PopupMenu加入到目标组件中
为需要出现上下文菜单的组件编写鼠标监听器,当用户释放鼠标右键时弹出右键菜单。
示例程序:
————————————————————————————————————————————————————————
在AWT中绘图:
画图的实现原理:
(1)在Component类里提供了以下和绘图有关的方法:
paint(Graphics g)绘制组件的外观
update(Graphics g) 调用paint()方法,刷新组件外观
repaint();调用update()方法,刷新组件外观。
上面3个方法的调用关系为:repaint()调用update()方法,update()方法调用paint()方法。
(2)Container类里的update()方法先以组件的背风景填充全部组件区域,然后调用paint()方法重画组件。
——————————————————————————————————————————————————————
使用Graphics类
(1)Graphics是1个抽象的画笔对象,Graphics可以在组件上绘制丰富多彩的几何图形和位图,其提供的方法以下
drawLine() 绘制直线
drawString()绘制字符串
drawRect()绘制矩形
drawRoundRect()绘制圆角矩形
drawOval()绘制椭圆形状
drawPolygon()绘制多边形边框
drawArc()绘制1段圆弧
drawPolyline()绘制折线
fillRect()填充矩形
fillRoundRect()填充圆角矩形
fillOval()填充椭圆形状
fillPolygon()填充多边形
fillArc()填充圆弧两个端点到中心连线所包围的区域
drawImage()绘制位图
除此以外,Graphics还提供了setColor()和setFont()两个方法来设置画笔的色彩和字体。
(2)AWT专门提供了1个Canvas类作为绘图的画布,程序可以通过创建Canvas的子类,并重写它的paint()方法来实现绘图。
示例:简单的绘图程序
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Panel;
import java.util.Random;
public class SimpleDraw{
private final String RECT_SHAPE="rect";
private final String OVAL_SHAPE="oval";
private Frame f=new Frame("简单绘图");
private Button rect=new Button("绘制矩形");
private Button oval=new Button("绘制圆形");
private MyCanvas drawArea =new MyCanvas();
//用来保存需要绘制甚么图形的变量
private String shape="";
public void init()
{
Panel p=new Panel();
rect.addActionListener(e ->
{
//设置shape变量为RECT_SHAPE
shape=RECT_SHAPE;
//重画MyCanvas对象,即调用它的repait()方法
drawArea.repaint();
}
);
oval.addActionListener(e ->
{
//设置shape变量为OVAL_SHAPE
shape=OVAL_SHAPE;
//重画MyCanvas对象,即调用它的repait()方法
drawArea.repaint();
}
);
p.add(rect);
p.add(oval);
drawArea.setPreferredSize(new Dimension(250,180));
f.add(drawArea);
f.add(p, BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}
public static void main(String[] args){
new SimpleDraw().init();
}
class MyCanvas extends Canvas{
//重写Canvas的paint()方法,实现绘画
public void paint(Graphics g){
Random rand=new Random();
if(shape.equals(RECT_SHAPE)){
//设置画笔色彩
g.setColor(new Color(220, 100, 80));
//随机画1个矩形块
g.drawRect(rand.nextInt(200), rand.nextInt(120), 40, 60);
}
if(shape.equals(OVAL_SHAPE)){
//设置画笔色彩
g.setColor(new Color(220, 100, 80));
g.fillOval(rand.nextInt(200), rand.nextInt(120), 50, 40);
}
}
}
}