2012-02-15 39 views
0

有沒有什麼辦法在j2me中創建一個標籤菜單?
我發現了一個代碼,但我無法理解它在j2me中創建Tabmenu

在這段代碼有創建的選項卡菜單,在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; 
     } 
    } 
} 

回答

0

當我嘗試使用paint方法繪製的上面和下面這段代碼什麼,這是行不通的

你使用paint方法在之上和之下畫?請注意,有兩個方法命名的方式 - 第一個是在TabMenuCanvas中,第二個是在TabMenu中(第二個方法是從TabMenuCanvas#repaint中調用的)。

  • 無論你想嘗試在TabMenuCanvas#paint得出最有可能通過setClip的和fillRect被覆蓋時TabMenu#paint調用下面重畫請求

,人們可以期望能夠得出的唯一的地方東西可見似乎在TabMenu#paint方法,在那裏設置的剪輯區域內。