Создание Табмену в j2me - PullRequest
       69

Создание Табмену в j2me

0 голосов
/ 15 февраля 2012

Есть ли способ создать меню вкладок в j2me?
Я нашел код, но не могу его понять

В этом коде создается меню вкладок в классе Canvas, а затем создается меню вкладок, которое полностью выполняется в Canvas или раскрашивается. Единственное, что мне было трудно понять, это метод void go(), а затем

Когда я пытаюсь нарисовать что-нибудь выше и ниже этого кода, используя метод рисования, это не работает - в чем проблема?

Ниже приведен код

// 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 голосов
/ 21 февраля 2012

Вы можете использовать библиотеки GUI для J2ME, например, Облегченный инструментарий интерфейса пользователя (LWUIT) , Flemil имеет «меню вкладок». Вы можете увидеть список библиотек GUI здесь .

0 голосов
/ 15 февраля 2012

Когда я пытаюсь нарисовать что-нибудь выше и ниже этого кода, используя метод рисования, он не работает

, какой из paint методов вы используете для рисования вышеа ниже ?Обратите внимание, что два метода названы таким образом - первый находится в TabMenuCanvas, второй - в TabMenu (второй метод вызывается из TabMenuCanvas # repaint).

  • независимо от того, что вы попытаетесьрисование в TabMenuCanvas#paint, скорее всего, будет перезаписано setClip и fillRect , когда TabMenu#paint вызывается после запроса на перерисовку

Единственное место, где можно ожидать, что он сможетрисовать что-то видимое, кажется, в методе TabMenu#paint, внутри области клипа, которая там установлена.

...