`
fonter
  • 浏览: 868167 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

J2ME Tabbed Menu

    博客分类:
  • J2ME
阅读更多

原文转载自:http://wiki.forum.nokia.com/index.php/J2ME_Tabbed_Menu

 

We will build a reusable Tabbed Menu using J2ME.

Image:J2me_tabbed_menu.jpg

 

View it in action

You can find a midlet showing this component in action here.

Our component will support:

  • Full styling of tabs (bg color, fore color, font face, margin, paddings and corner radius)
  • Automatic horizontal scrolling, so that you can put as many tab you want, without caring about screen width

Building the tabbed menu

Let's start from the customizable variables, whose aim is self-explaining:

 

int background = 0xffffff;
int bgColor = 0xcccccc;
int bgFocusedColor = 0x0000ff;
int foreColor = 0x000000;
int foreFocusedColor = 0xffffff;
int cornerRadius = 4;
int padding = 2;
int margin = 2;
Font font = Font.getDefaultFont();
int scrollStep = 20;

 

 

Then we'll define some internal variables, used to mantain the tabbed menu state:

 

int selectedTab = 0;	//selected tab index
int[] tabsWidth = null;	//width of single tabs
int[] tabsLeft = null;	//left X coordinate of single tabs
int tabHeight = 0;		//height of tabs (equal for all tabs)
String[] tabs = null;	//tab labels
int menuWidth = 0;		//total menu width
 
int viewportWidth = 0;	//visible viewport width
int viewportX = 0;		//current viewport X coordinate

 

Now, we'll define a simple constructor accepting tab labels and viewport width as parameters:

 

public TabMenu(String[] tabs, int width)
{
	this.tabs = tabs;
	
	this.viewportWidth = width;
	
	initialize();
}
void initialize()
{
	tabHeight = font.getHeight() + cornerRadius + 2 * padding;
	
	menuWidth = 0;
	
	tabsWidth = new int[tabs.length];
	tabsLeft  = new int[tabs.length];
	
	for(int i = 0; i < tabsWidth.length; i++)
	{
		tabsWidth[i] = font.stringWidth(tabs[i]) + 2 * padding + 2 * cornerRadius;
		
		tabsLeft[i] = menuWidth;
		
		menuWidth += tabsWidth[i];
		
		if(i > 0)
		{
			menuWidth += margin;
		}
	}
}

 

Now, let's define an utility method to check if a tab is visible or not.

 

private boolean isTabVisible(int tabIndex)
{
	return tabsLeft[tabIndex] < viewportX + viewportWidth &&
		tabsLeft[tabIndex] + tabsWidth[tabIndex] >= viewportX;
}

 

And now we'll implement the tab switching/scrolling methods, that will use the isTabVisible method defined above:

 

public void goRight()
{
	go(+1);
}
public void goLeft()
{
	go(-1);
}
private void go(int delta)
{
	int newTab = Math.max(0, Math.min(tabs.length - 1, selectedTab + delta));
	
	boolean scroll = true;
	
	if(newTab != selectedTab && isTabVisible(newTab))
	{
		selectedTab = newTab;
		
		if(	(delta > 0 && tabsLeft[selectedTab] + tabsWidth[selectedTab] > viewportX + viewportWidth) || 
			(delta < 0 && tabsLeft[selectedTab] < viewportX))
		{
			scroll = true;
		}
		else
		{
			scroll = false;
		}
	}
	if(scroll)
	{
		viewportX = Math.max(0, Math.min(menuWidth - viewportWidth, viewportX + delta * scrollStep));
	}
}

 

And now, we're ready to paint our menu :) 

 

public void paint(Graphics g)
{
	int currentX = - viewportX;
		
	g.setClip(0, 0, viewportWidth, tabHeight);
		
	g.setColor(background);
	g.fillRect(0, 0, viewportWidth, tabHeight);
		
	for(int i = 0; i < tabs.length; i++)
	{
		g.setColor(i == selectedTab ? bgFocusedColor : bgColor);
			
		g.fillRoundRect(currentX, 0, tabsWidth[i], tabHeight + cornerRadius, 2 * cornerRadius, 2 * cornerRadius);
			
		g.setColor(i == selectedTab ? foreFocusedColor : foreColor);
			
		g.drawString(tabs[i], currentX + cornerRadius + padding, cornerRadius + padding, Graphics.LEFT | Graphics.TOP);
		
		currentX += tabsWidth[i] + margin;
	}
}

 

Download source code

You can download source code of TabMenu here:

开源一个J2ME解析类 http://fonter.iteye.com/blogs/409830

 手机中的重定向问题及处理 http://fonter.iteye.com/blog/400836
J2ME如何通过cmwap直接访问互连网 http://fonter.iteye.com/blog/400868
安装JAD时提示JAD无效原因之一 http://fonter.iteye.com/blog/400888
J2ME网络交互之优化 http://fonter.iteye.com/blog/405137
解决Eclipse无法调试J2ME程序的配置方法 http://fonter.iteye.com/blog/405697

J2ME模拟器加载RMS时突然失效的原因 http://fonter.iteye.com/blog/407576

J2ME飞信协议分析(初稿) http://fonter.iteye.com/blog/408385

 

 

分享到:
评论

相关推荐

    J2ME开发 J2ME开发 J2ME开发

    J2ME,全称Java 2 Micro Edition,是Java平台的一个子集,主要用于嵌入式设备和移动设备的开发,如手机、智能电表、家庭自动化设备等。它提供了跨平台的开发环境,使得开发者可以编写一次代码,到处运行。J2ME由两大...

    j2me_plane.rar_j2me_j2me 飞机_j2me 飞机 游戏_飞机游戏

    《J2ME飞机游戏开发详解》 J2ME(Java 2 Micro Edition)是Java平台的一个子集,专为移动设备、嵌入式系统等资源有限的环境设计。本篇文章将深入探讨如何利用J2ME技术开发一款简单的飞机游戏,以此帮助初学者理解...

    J2ME源码 3d_menu(代码)

    【J2ME源码 3d_menu(代码)】是一个基于Java 2 Micro Edition (J2ME) 平台开发的项目,它提供了一个三维菜单的实现。J2ME是Java的一个子集,专为资源有限的移动设备如手机和嵌入式系统设计,用于开发和部署应用程序...

    J2ME API 2.0 J2ME使用手册 J2ME帮助文档

    **J2ME API 2.0 - J2ME使用手册 - J2ME帮助文档** Java 2 Micro Edition(J2ME)是Java平台的一个子集,专为资源有限的设备如移动电话、智能手表和家用电器等设计。J2ME API 2.0 提供了在这些小型设备上开发应用...

    J2ME_Map.rar_J2ME 地图_J2ME游戏_j2me 游戏_j2me_m_绘制地图

    在J2ME(Java 2 Micro Edition)平台上开发游戏时,地图的设计与绘制是至关重要的一个环节。J2ME作为一种轻量级的Java平台,广泛应用于移动设备,如早期的智能手机和平板电脑,用于实现各种应用程序,特别是游戏。本...

    J2ME中文版教程 J2ME教程

    **J2ME中文版教程——全面解读移动设备编程** J2ME(Java 2 Micro Edition)是Java平台的一个重要组成部分,专为嵌入式设备、移动电话和其他资源有限的设备设计。这个J2ME中文版教程是针对初学者和有一定经验的...

    J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏下,上为另一部分

    J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏

    J2ME小游戏J2ME小游戏J2ME小游戏上,下为另一部分

    J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏

    j2me开发框架介绍

    j2me 开发框架介绍 j2me 是一种用于开发无线应用程序的平台,它提供了一个灵活、强大和开放的开发环境。随着 j2me 的普及,出现了许多开源框架,旨在简化开发过程,提高开发效率。下面将介绍这些框架,並分析它们的...

    J2ME教材:J2ME&Gaming中文版

    **J2ME教材:J2ME&Gaming中文版** J2ME,全称为Java 2 Micro Edition,是Java平台的一个子集,主要用于嵌入式设备和移动设备,如手机、智能手表等。这个“J2ME&Gaming中文版”教材主要针对的是Java在游戏开发领域的...

    j2me手机浏览器/j2me手机浏览器

    Java 2 Micro Edition (J2ME) 是一种Java平台,专为嵌入式设备和移动设备,特别是手机设计。在2000年代初期,J2ME是许多非智能手机上实现互联网浏览的主要技术,其中“j2me手机浏览器”就是这样一个应用。这个应用...

    j2me游戏.rar

    Java 2 Micro Edition(J2ME)是一种针对嵌入式设备和移动设备的Java平台,主要用于开发手机游戏、应用程序和服务。"j2me游戏.rar"很可能是包含了一系列使用J2ME技术开发的游戏资源包。在本文中,我们将深入探讨J2ME...

    Tank_J2ME.rar_j2me

    【标题】"Tank_J2ME.rar_j2me" 指的是一个关于J2ME(Java 2 Micro Edition)平台的项目,其中包含了实现“塔克大战”游戏的源代码和资源文件。J2ME是Java的一个子集,主要用于开发在移动设备、嵌入式系统等小型设备...

    j2me经典游戏源码

    Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于开发和部署移动设备、嵌入式设备上的应用程序。这款"j2me经典游戏源码"提供了一个绝佳的学习平台,帮助开发者深入理解J2ME游戏编程的核心概念和技术。 ...

    j2me课件.rar

    Java 2 Micro Edition(J2ME)是Java平台的一个重要组成部分,主要针对嵌入式设备和移动设备,如手机、智能电表、机顶盒等。这个“j2me课件.rar”压缩包包含了浙江工业大学软件工程专业2009年的J2ME课程相关材料,...

    j2ME手机移动开发

    **j2ME手机移动开发** Java 2 Micro Edition(j2ME)是Java平台的一个重要分支,主要用于开发在小型设备上运行的应用程序,如手机、智能手表和家用电器等。j2ME为移动设备提供了丰富的功能,使得开发者可以构建功能...

    j2me移植Android引擎

    【标题】"J2ME移植Android引擎"涉及的是将基于Java Micro Edition (J2ME) 开发的游戏或应用转换到Android平台的过程。J2ME是Java平台的一个子集,主要用于移动设备和嵌入式系统,而Android则是一个开源的操作系统,...

    安卓AIDE开发J2ME

    【安卓AIDE开发J2ME】是一个教程主题,它涵盖了使用AIDE集成开发环境(IDE)来开发Java Micro Edition (J2ME)应用程序的过程。AIDE是一款强大的Android开发工具,通常用于编写原生的Android应用,但在此场景下,它被...

    j2me例子大全,涵盖j2me的各各方面

    Java 2 Micro Edition(J2ME)是一种针对嵌入式设备和移动设备的Java平台,主要用于开发移动应用程序,包括手机游戏、网络应用以及多媒体播放器等。本资源包"j2me例子大全"包含了J2ME技术的多个方面,旨在为开发者...

    J2ME开发源码大全

    J2ME,全称Java 2 Micro Edition,是Java平台的一个子集,专门用于嵌入式设备和移动设备的开发,如手机、智能家电等。它提供了轻量级的运行环境和API,使得开发者能够在资源有限的设备上构建功能丰富的应用程序。 ...

Global site tag (gtag.js) - Google Analytics