Java me 在j2me中创建Tabmenu

Java me 在j2me中创建Tabmenu,java-me,canvas,tabs,midp,lcdui,Java Me,Canvas,Tabs,Midp,Lcdui,有没有办法在j2me中创建选项卡菜单? 我找到了一个代码,但我无法理解它 在这段代码中,在Canvas类中创建了Tab菜单,然后创建了Tab菜单,这完全是在Canvas或painted中完成的。我发现唯一难以掌握的部分是void go()方法,然后 当我尝试使用paint方法在代码上方和下方绘制任何内容时,它都不起作用-有什么问题吗 下面是代码 // Tab Menu CANVAS class import javax.microedition.lcdui.Canvas; impor

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

在这段代码中,在Canvas类中创建了Tab菜单,然后创建了Tab菜单,这完全是在Canvas或painted中完成的。我发现唯一难以掌握的部分是
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;
        }
    }
}
//选项卡菜单画布类
导入javax.microedition.lcdui.Canvas;
导入javax.microedition.lcdui.Graphics;
公共类TabMenuCanvas扩展画布
{
TabMenu=null;
公共TabMenuCanvas()
{
菜单=新选项卡菜单(
新字符串[]{“主页”、“新闻”、“社区”、“您的文件”、“信用”、“活动”、“博客”、“上传”、“诺基亚论坛”},
getWidth()-20
);
}
按下受保护的无效键(int键)
{
int gameAction=getGameAction(键);
if(gameAction==Canvas.RIGHT)
{
menu.goRight();
重新油漆();
}
else if(gameAction==Canvas.LEFT)
{
menu.goLeft();
重新油漆();
}
}
受保护的空心漆(图g)
{
g、 翻译(10,30);
菜单.油漆(g);
g、 翻译(-10,-30);
}
}
//选项卡菜单类
导入javax.microedition.lcdui.Font;
导入javax.microedition.lcdui.Graphics;
公共类选项卡菜单
{
int-background=0xffffff;
int bgColor=0xcccc;
int bgFocusedColor=0x0000ff;
int-foreColor=0x000000;
int前焦点颜色=0xffffff;
int转弯半径=6;
int=2;
整数裕度=2;
Font Font=Font.getDefaultFont();
int-step=20;
int selectedTab=0;//所选选项卡索引
int[]tabsWidth=null;//单个选项卡的宽度
int[]tabsLeft=null;//单个选项卡的左X坐标
int tabHeight=0;//制表符的高度(所有制表符的高度相同)
String[]tabs=null;//选项卡标签
int menuWidth=0;//菜单总宽度
int viewportWidth=0;//可见视口宽度
int viewportX=0;//当前视口X坐标
公共选项卡菜单(字符串[]选项卡,整数宽度)
{
this.tabs=tabs;
this.viewportWidth=宽度;
初始化();
}
void initialize()
{
tabHeight=font.getHeight()+cornerRadius+2*填充;//[所有选项卡相同]
menuWidth=0;
tabsWidth=newint[tabs.length];
tabsLeft=新整数[tabs.length];
for(int i=0;i0)
{
menuWidth+=保证金;
}
}
}
公共权利
{
围棋(+1);
}
公共高尔夫球场()
{
go(-1);
}
专用无效go(内部增量)
{
int newTab=Math.max(0,Math.min(tabs.length-1,selectedTab+delta));
布尔滚动=真;
如果(newTab!=已选择的选项卡(&I)可见(newTab))
{
selectedTab=newTab;
如果((增量>0&&tabsLeft[selectedTab]+tabsWidth[selectedTab]>viewportX+viewportWidth)|
(增量<0&&tabsLeft[selectedTab]=viewportX;
}
公共空间涂料(图g)
{
int currentX=-viewportX;
g、 setClip(0,0,视口宽度,选项卡高度);
g、 设置颜色(背景);
g、 fillRect(0,0,viewportWidth,tabHeight);
对于(int i=0;i
当我尝试使用paint方法在代码上方和下方绘制任何内容时,它都不起作用

您在上面和下面绘制时使用的
绘制方法是什么?请注意,有两种方法以这种方式命名,第一种是在TabMenuCanvas中,第二种是在TabMenu中(第二种方法从TabMenuCanvas#repaint调用)

  • 在重新绘制请求后调用
    TabMenu#paint
    时,无论您在
    TabMenu#paint
    中尝试绘制什么,都很可能被setClip和fillRect覆盖

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

您可以使用J2ME的GUI库,例如,有“tab menu”。您可以看到GUI库的列表