在j2me中创建选项卡菜单

发布于 2025-01-05 10:26:40 字数 4485 浏览 5 评论 0原文

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

在这段代码中,创建了位于 Canvas 类中的选项卡菜单,然后创建了完全在 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;
        }
    }
}

Is there any way to create a Tab Menu in j2me?
I found a code but I am unable to understand it

In this code there is Tab Menu created which is in Canvas class and then Tab menu is created which is totally done in Canvas or painted. The only part I found difficult to grasp was the void go() method and then

When I try to draw anything above and below this code using paint method, it doesn't work - what's the problem?

Below is the code

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

冷情妓 2025-01-12 10:26:40

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

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

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

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

When I try to draw anything above and below this code using paint method, it doesn't work

what of the paint methods you use to draw above and below? Pay attention that there are two methods named that way - first is in TabMenuCanvas, second is in TabMenu (second method is invoked from TabMenuCanvas#repaint).

  • whatever you would try to draw in TabMenuCanvas#paint will most likely be overwritten by setClip and fillRect when TabMenu#paint is invoked following repaint request

The only place where one can expect to be able to draw something visible seems to be in TabMenu#paint method, inside the clip area that is set there.

简单气质女生网名 2025-01-12 10:26:40

您可以使用 J2ME 的 GUI 库,例如 轻量级用户界面工具包 (LWUIT)Flemil 有“选项卡菜单”。您可以看到 GUI 库列表 此处

You can use GUI Libraries for J2ME,for example Lightweight User Interface Toolkit (LWUIT),Flemil have "tab menu".You can see list of GUI Libraries here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文