国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

在Panel中實現(xiàn)菜單功能

2019-11-18 15:23:35
字體:
供稿:網(wǎng)友

  大 連 理 工 大 學(xué) 計 算 機 系
鄧?yán)^光 翟麗萍 張麗濱

---- 一.java 簡 介

---- Java 技 術(shù) 是 一 個 嶄 新 的 技 術(shù), 它 從C++ 中 吸 收 了 許 多 強 有 力 的 成 分, 并 且 帶 有 許 多 新 的 特 征, 如

? ? ?

---- Java 標(biāo) 準(zhǔn) 類 庫 中 對Internet 和web 內(nèi) 建 的 支 持, 使 得 開 發(fā) 者 可 方 便 地 開 發(fā) 網(wǎng) 絡(luò) 應(yīng) 用。
---- 自 從Java 誕 生 以 來, 眾 多 的 公 司 已 致 力 于Java 開 發(fā) 平 臺 的 研 制,Sun,Microsoft,Borland 和Symantec 爭 相 推 出 了 自 己 的Java 開 發(fā) 平 臺。JavaSoft 公 司 推 出 的JDK 以 其 靈 活 性 和 強 大 功 能 得 到 了 眾 多 開 發(fā) 者 的 青 睞。

---- 二. JDK1.1.1 中 的 菜 單 功 能

---- 在JDK1.1.1 中 菜 單 功 能 具 體 由java.awt.Menu ,java.awt.MenuBar ,java.awt.MenUComponent ,java.awt.MenuItem ,java.awt.MenuShortcut 實 現(xiàn), 其 繼 承 關(guān) 系 如 下:

java.lang.object
java.awt.MenuComponent
java.awt.MenuItem
java.awt.Menu
java.awt.PopupMenu
java.awt.MenuBar
java.awt.MenuShortcut

---- 在java.awt.Frame 中 實 現(xiàn) 了java.awt.MenuContainer, 利 用 其setMenuBar 方 法 即 可 提 供 菜 單 服 務(wù)。 但 一 個application 中 只 應(yīng) 有 一 個Frame(Dialog 除 外) 同 時 存 在, 否 則 所 有 的component 不 能 構(gòu) 成 一 個 整 體(Frame 可 被 自 由 拖 動), 這 樣 如 僅 利 用JDK1.1.1 提 供 的 功 能,Application 中 只 能 存 在 一 個 菜 單。 由Frame 的
---- ? ? ?

---- Frame 是 一 個Container, 它 可 以 裝 入 多 個Panel, 如 能 在Panel 中 實 現(xiàn) 菜 單 功 能, 就 可 以 在Application 中 提 供 多 菜 單 服 務(wù) 了。

---- 三. 在Panel 中 實 現(xiàn) 菜 單 功 能

---- 在Panel 中 實 現(xiàn) 菜 單 功 能 可 有 如 下 三 種 途 徑

---- 1. 模 仿java.awt.Frame 的 菜 單 服 務(wù), 在Panel 中 加 入 菜 單 功 能

---- 2. 利 用JDK 提 供 的 部 分 功 能, 和 自 己 的component 組 合 完 成

---- 3. 完 全 用 自 己 的component 實 現(xiàn)

---- java.awt.Frame 和java.awt.Panel 各 自 的 繼 承 關(guān) 系 如 下:

java.lang.Object
java.awt.Component
java.awt.Container
java.awt.Window
java.awt.Frame
java.awt.Panel

---- 由 繼 承 關(guān) 系 可 以 看 出, 要 模 仿java.awt.Frame 的 菜 單 服 務(wù), 在Panel 中 加 入 菜 單 功 能, 是 比 較 困 難 的, 況 且,JDK 文 檔 中 并 未 提 供 完 整 的 源 代 碼。
---- 如 要 完 全 用 自 己 的component 實 現(xiàn), 則 需 考 慮 復(fù) 雜 的 屏 幕 刷 新 和 事 件 處 理 問 題, 也 是

---- ? ? ?

---- 而 利 用JDK1.1.1 的java.awt.Component 中 提 供 的PopupMenu 功 能, 在 上 面 加 上label, 在 鼠 標(biāo) 點 擊label 時, 彈 出PopupMenu, 以 此 模 仿Frame 提 供 的 菜 單 服 務(wù), 可 以 較 容 易 的 在Panel 中 加 入 菜 單 功 能。 具 體 實 現(xiàn) 如 下:

---- // 此listener 用 于 發(fā) 出MenuBarLabel 點 擊 事 件

public interface MenuBarLabelListener
{
public void PRocessLabelClick(String labelName);
}

import java.awt.* ;
import java.awt.event.* ;
import java.util.*;

//MenuBarLabel 用 于 模 擬java.awt.MenuBar 的 功 能
public class MenuBarLabel extends
Canvas implements MouseListener
{
protected Color Foreground = Color.black ;
protected Color Background = Color.lightGray;
protected String xlabel ;
protected boolean disabled = false ;
protected MenuBarLabelListener listener=null;

public MenuBarLabel(String xlabel)
{
this.xlabel = new String(xlabel);
setFont(new Font("Courier",Font.PLAIN,16));
setBackground(Background);
addMouseListener(this);
}

public void addListener(MenuBarLabelListener listener)
{
this.listener=listener;
}

public String getName()
{
return xlabel;
}

public void paint(Graphics g)
{
Dimension dm = getSize();
int width = dm.width;
int height= dm.height;
g.setColor(Foreground);

int descent = g.getFontMetrics().getDescent();
g.drawString(xlabel,0,height-descent);
}
public void mouseClicked(MouseEvent evt){ ;}
public void mouseEntered(MouseEvent evt){ ;}
public void mousePressed(MouseEvent evt)
{
Background=Color.blue.darker().darker();
paint();
if (null !=listener)
listener.ProcessLabelClick(xlabel);
}

public void mouseExited(MouseEvent evt)
{
Background=Color.lightGray;
setBackground(Background);
}

public void mouseReleased(MouseEvent evt)
{
Background=Color.lightGray;
setBackground(Background);
}

public void setForeground(Color Foreground)
{
this.Foreground = Foreground;
repaint();
}

public void setBackground(Color Background)
{
this.Background = Background;
repaint();
}

public void paint()
{
Graphics g=getGraphics();
if (null==g) return;
Dimension dm = getSize();
int width = dm.width;
int height= dm.height;
int descent = g.getFontMetrics().getDescent();
int height1=g.getFontMetrics().getHeight();
g.setColor(Color.blue.darker().darker());
g.fillRect(0,height-height1,width,height1);
g.setColor(Color.white);
g.drawString(xlabel,0,height-descent);
g.dispose();
}

public void paintBack()
{
Graphics g=getGraphics();
if (null==g) return;
Dimension dm = getSize();
int width = dm.width;
int height= dm.height;
int descent = g.getFontMetrics().getDescent();
g.setColor(Color.lightGray);
g.fillRect(0,0,width,height);
g.setColor(Foreground);
g.drawString(xlabel,0,height-descent);
g.dispose();
}
}

// 此listener 用 于 提 供 所 有 的 菜 單 選 擇 事 件
public interface MenuPanelListener
{
public void ProcessMyMenu(Object source,Object label);
//you can use source to indentify
different items with same label
}

//MenuPanel 提 供 菜 單 功 能 服 務(wù)
import java.awt.*;
import java.awt.event.*;
import java.util.*;
/**
*Pay attention:
*1.The MenuPanel′s height >==26, 26 recommended
*2.You can not change the
background of the menu because Popup
* menu′s backgroud can not be changed
*/

public class MenuPanel extends Panel implements
ActionListener,MenuBarLabelListener

{
Panel MyMenuBar=new Panel();
Panel popUpPanel=new Panel();
MenuBarLabel previousLabel=null;
MenuPanelListener listener=null;
Font labelFont=new Font("Courier",Font.PLAIN,16);
private Vector labelVector=new Vector();
private Vector popUpVector=new Vector();
int maxwidth=0;

public MenuPanel()

{
setLayout(null);
MyMenuBar.setLayout(null);
MyMenuBar.setBackground(Color.lightGray);
add(MyMenuBar);
add(popUpPanel);
MyMenuBar.setBounds(0,0,400,25);
popUpPanel.setLayout(null);
popUpPanel.setBounds(0,26,400,500);
popUpPanel.setVisible(false);
setFont(labelFont);
}

public void addListener(MenuPanelListener listener)
{
this.listener=listener;
}

private void addMenuItemListener(MenuComponent menu)
{
((MenuItem)menu).addActionListener(this);
if (menu instanceof Menu menu instanceof PopupMenu)
for (int i=0;i< ((Menu)menu).getItemCount();i++)
addMenuItemListener(((Menu)menu).getItem(i));

}

private void setMenuItemFont(MenuComponent menu)
{
menu.setFont(labelFont);
if (menu instanceof Menu menu instanceof PopupMenu)
for (int i=0;i< ((Menu)menu).getItemCount();i++)
setMenuItemFont(((Menu)menu).getItem(i));
}

public void addMenu(PopupMenu menu,String name)
{
if (menu==null name==null name.length()< =0)
return;
MenuBarLabel label=new MenuBarLabel(name);
label.setFont(labelFont);
label.addListener(this);
MyMenuBar.add(label);
labelVector.addElement(label);
setMenuItemFont(menu);
addMenuItemListener(menu);
popUpVector.addElement(menu);
popUpPanel.add(menu);
}

public void setMenuFont(Font menuFont)
{
int fontSize=menuFont.getSize();

if (menuFont.getSize() >25)
fontSize=25;
labelFont=new Font(menuFont.getName(),
menuFont.getStyle(),fontSize);
setFont(labelFont);
for (int i=0;i< popUpVector.size();i++)
setMenuItemFont(((PopupMenu)
popUpVector.elementAt(i)));
repaint();
}

public void paint(Graphics g)
{
MenuBarLabel label;
int width=0,width1;
int panelWidth=getParent().getSize().width;
if (panelWidth >0)
{
setSize(panelWidth,getSize().height);
MyMenuBar.setBounds(0,0,panelWidth,25);
popUpPanel.setBounds(0,26,panelWidth,500);
}
for (int i=0; i< labelVector.size();i++)
{
label=(MenuBarLabel)labelVector.elementAt(i);
label.setFont(labelFont);
width1=g.getFontMetrics().stringWidth(label.getName());
if (width1 >width)
width=width1;
}
if (width !=maxwidth)
{
maxwidth=width;
for (int i=0; i< labelVector.size();i++)
{
label=(MenuBarLabel)labelVector.elementAt(i);
label.setBounds(i*maxwidth+(i+1)*15,0,maxwidth,25);
}
}
}

public void ProcessLabelClick(String labelName)
{
MenuBarLabel label=null;
boolean inVector=false;
int i=0;
while (i< labelVector.size())
{
label=(MenuBarLabel)labelVector.elementAt(i);
if ((label.getName()).equals(labelName))
{
inVector=true;
break;
}
i++;
}
if (inVector)
{
if ((null !=previousLabel)&&
(!previousLabel.equals(label)))
previousLabel.paintBack();
previousLabel=label;
if (((PopupMenu)popUpVector.element
At(i)).getItemCount() >0)
{
popUpPanel.setVisible(true);
((PopupMenu)popUpVector.elementAt(i)).
show(popUpPanel,i*maxwidth+
(i+1)*15,0);
}
}
}

public void actionPerformed(ActionEvent evt)
{
if(null!=listener)
listener.ProcessMyMenu(evt.getSource(),
evt.getActionCommand());
}
}

---- 四. 應(yīng) 用 舉 例

---- 本 例 程 利 用 上 面 的MenuPanel, 在TestMenu 中 實 現(xiàn) 了 帶 兩 個 下 拉 菜 單 的 菜 單。

import java.awt.*;
public class TestMenu extends Frame
implements MenuPanelListener
{
public TestMenu()
{
setLayout(null);
setSize(400,300);
MenuPanel myPanel=new MenuPanel();
MenuPanel.addListener(this);
// 在myPanel 中 加 入listener
PopupMenu popupMenu1=new PopupMenu("menu1");
//"menu1" 即 為 顯 示 的label
Menu subMenu1=new Menu("test1");
subMenu1.addMenuItem(new MenuItem("item1"))
subMenu1.addMenuItem(new MenuItem("item2"))
Menu subMenu2=new Menu("test2");
subMenu2.addMenuItem(new MenuItem("item3"))
subMenu2.addMenuItem(new MenuItem("item4"))
Menu subMenu3=new Menu("test3");
subMenu3.addMenuItem(new MenuItem("item5"))
subMenu3.addMenuItem(new MenuItem("item6"))
popupMenu1.addMenuItem(subMenu1);
popupMenu1.addMenuItem(subMenu2);
popupMenu1.addMenuItem(subMenu3);
myPanel.addMenu(popupMenu1);

PopupMenu popupMenu2=new PopupMenu
("menu2");//"menu2" 即 為 顯 示 的label
Menu subMenu4=new Menu("test4");
subMenu4.addMenuItem(new MenuItem("item7"))
subMenu4.addMenuItem(new MenuItem("item8"))
Menu subMenu5=new Menu("test5");
subMenu5.addMenuItem(new MenuItem("item9"))
subMenu5.addMenuItem(new MenuItem("item10"))
Menu subMenu6=new Menu("test6");
subMenu6.addMenuItem(new MenuItem("item11"))
subMenu6.addMenuItem(new MenuItem("item12"))
popupMenu2.addMenuItem(subMenu4);
popupMenu2.addMenuItem(subMenu5);
popupMenu2.addMenuItem(subMenu6);
myPanel.addMenu(popupMenu2);

myPanel.setBounds(0,0,400,26);
add(MenuPanel);
}

public void ProcessMyMenu(Object source,Object label)
{ System.out.println((String)label);
}

protected void processEvent(AWTEvent evt)
{ if (evt.id == Event.WINDOW_DESTROY) System.exit(0);
}

}

---- 注: 本 文 程 序 在Win95 下, 用JDK1.1 調(diào) 試 通 過。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 鄂尔多斯市| 竹山县| 望谟县| 曲麻莱县| 兴宁市| 兴和县| 从化市| 南涧| 海南省| 拜城县| 道孚县| 漯河市| 安平县| 宜昌市| 定西市| 宽城| 延吉市| 和硕县| 石景山区| 仁化县| 柘城县| 通许县| 巨鹿县| 内丘县| 和顺县| 无为县| 航空| 宝鸡市| 保定市| 韩城市| 大同县| 曲水县| 莱西市| 宜宾市| 法库县| 铜川市| 厦门市| 开封县| 和田市| 祥云县| 镇原县|