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);
}
}
}
}