Namespaces
Variants
Actions
(Redirected from J2ME Tabbed Menu)

Tabbed Menu in Java ME

Jump to: navigation, search
Article Metadata

Article
Created: jappit (11 Apr 2008)
Last edited: hamishwillee (07 Feb 2012)

We will build a reusable Tabbed Menu using J2ME.

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 maintain 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:

Comments

Reviewer-approved.png
29 Sep
2009
Article Review by Larry101 (20090929)

This article provides a code example demonstrating how to create a simple tabbed menu control in Java ME. The tabbed menu control supports horizontal scrolling (when the tabs don't fit on the screen) and also allows the programmer to customize the appearance of the tabs. The code example is separated into various sections, showing variables for customizing the appearance of the control, internal variables, code for creating the control, code for navigation and code for rendering the tabbed control.

The code example is nicely written and separated into sections, each of which demonstrates a different aspect of the control. The use of meaningful variable names means that the code is easy to understand. It was also useful that a link was provided which shows the control in action. For those who want a very simple tabbed menu control, this code might well suit their needs. For those wanting something a bit more advanced, they might want to check out some of the other UI frameworks for Java ME, such as the LWUIT and J2MEPolish. Many of these also provide tabbed controls, some of which might provide more advanced functionality, albeit that you're then required to use those UI frameworks in your application. Nevertheless, a useful article, considering that Java ME does not provide a standard tabbed menu control.


This page was last modified on 7 February 2012, at 05:35.
146 page views in the last 30 days.
Nokia Developer aims to help you create apps and publish them so you can connect with users around the world.

京ICP备05048969号  © Copyright Nokia 2012 All rights reserved