在j2me中创建Tabmenu

时间:2012-02-15 07:02:25

标签: java-me canvas tabs midp lcdui

有没有办法在j2me中创建标签菜单?
我找到了一个代码,但我无法理解它

在此代码中,创建了Tab Menu,它位于Canvas类中,然后创建了Tab菜单,该菜单完全在Canvas中完成或绘制。我发现很难掌握的唯一部分是void go()方法,然后是

当我尝试使用paint方法在此代码的上方和下方绘制任何内容时,它不起作用 - 这是什么问题?

以下是代码

// Tab Menu CANVAS class


  import javax.microedition.lcdui.Canvas;
  import javax.microedition.lcdui.Graphics;
public class TabMenuCanvas extends Canvas
{
    TabMenu menu = null;

    public TabMenuCanvas()
    {
        menu = new TabMenu(
            new String[]{"Home", "News", "Community", "Your files", "Credits", "Events", "Blog", "Upload", "Forum Nokia"}, 
            getWidth() - 20
        );
    }

    protected void keyPressed(int key)
    {
        int gameAction = getGameAction(key);

        if(gameAction == Canvas.RIGHT)
        {
            menu.goRight();

            repaint();
        }
        else if(gameAction == Canvas.LEFT)
        {
            menu.goLeft();

            repaint();
        }
    }

    protected void paint(Graphics g)
    {
        g.translate(10, 30);

        menu.paint(g);

        g.translate(- 10, - 30);
    }
}


// Tab Menu Class 
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
public class TabMenu
{
    int background = 0xffffff;

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

    int scrollStep = 20;

    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

    public TabMenu(String[] tabs, int width)
    {
        this.tabs = tabs;

        this.viewportWidth = width;

        initialize();
    }
    void initialize()
    {
        tabHeight = font.getHeight() + cornerRadius + 2 * padding; //[ same for all tabs]

        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;
            }
        }
    }
    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));
        }
    }
    private boolean isTabVisible(int tabIndex)
    {
        return tabsLeft[tabIndex] < viewportX + viewportWidth &&
            tabsLeft[tabIndex] + tabsWidth[tabIndex] >= viewportX;
    }

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

2 个答案:

答案 0 :(得分:0)

  

当我尝试使用paint方法在此代码的上方和下方绘制任何内容时,它不起作用

用于在上方和下方绘制paint方法是什么?注意有这样命名的两个方法 - 首先是在TabMenuCanvas中,第二个是在TabMenu中(第二个方法是从TabMenuCanvas #repaint中调用的)。

  • TabMenuCanvas#paint中尝试绘制的内容很可能会在重绘请求后调用TabMenu#paint时被 setClip和fillRect 覆盖

人们可以期望能够绘制可见内容的唯一地方似乎是在TabMenu#paint方法中,在那里设置的剪辑区域内。

答案 1 :(得分:0)

您可以将GUI库用于J2ME,例如Lightweight User Interface Toolkit (LWUIT)Flemil具有“标签菜单”。您可以看到GUI库列表here