Java 如何在Codename one中动态设置SideMenuBar的可见性?

Java 如何在Codename one中动态设置SideMenuBar的可见性?,java,codenameone,Java,Codenameone,使用codenameone中的Toolbar类,如何动态设置SideMenuBar的可见性 我使用的是WebBrowser组件,我只希望在登录后可以访问侧菜单 当我在侧菜单栏上简单地放置命令时,我实现了我想要的行为(方法1),但是现在我已经切换到使用工具栏类来实现LnF优势(方法2),似乎没有观察到hidelefstidemenubool主题常量 //METHOD 1 //CHANGING THE THEME DYNAMICALLY HIDES THE SIDEMENUBAR WHEN I'VE

使用codenameone中的Toolbar类,如何动态设置SideMenuBar的可见性

我使用的是WebBrowser组件,我只希望在登录后可以访问侧菜单

当我在侧菜单栏上简单地放置命令时,我实现了我想要的行为(方法1),但是现在我已经切换到使用工具栏类来实现LnF优势(方法2),似乎没有观察到
hidelefstidemenubool
主题常量

//METHOD 1
//CHANGING THE THEME DYNAMICALLY HIDES THE SIDEMENUBAR WHEN I'VE SIMPLY 
//ADDED COMMANDS LIKE THIS
current.addCommand(new Command("Home") {
    {
      putClientProperty("place", "side");
    }
});

//METHOD 2
//CHANGING THE THEME DYNAMICALLY DOES NOT HIDE THE SIDEMENUBAR WHEN I'VE
//USED toolbar.addComponentToSideMenu TO ADD BUTTONS WITH COMMANDS 
toolbar = new Toolbar();
current.setToolbar(toolbar);
Button home = new Button("Home");
toolbar.addComponentToSideMenu(home, new Command("Home"){

  @Override
  public void actionPerformed(ActionEvent evt) {
    wb.setURL(startURL);
  }
});

...

//I USED THE FOLLOWING CODE TO DYNAMICALLY SET THE THEME AFTER EVALUATING A 
//WebBrowser URI REGARDLESS OF WHICH METHOD WAS USED TO ADD COMMANDS
wb.setBrowserNavigationCallback(new BrowserNavigationCallback() {
  public boolean shouldNavigate(String url) {
    if ((url.indexOf("users/login") != -1)) {
        try {
            //theme_noside.res has hideLeftSideMenuBool set to true
            theme = Resources.openLayered("/theme_noside");
            UIManager.getInstance().setThemeProps(theme.getTheme(theme.getThemeResourceNames()[0]));
            UIManager.getInstance().getLookAndFeel().setMenuBarClass(SideMenuBar.class);
            Display.getInstance().setCommandBehavior(Display.COMMAND_BEHAVIOR_SIDE_NAVIGATION);
            current.refreshTheme();
        }catch(IOException e){
            Log.p(e.toString());
        }
    }
    else {
        try {
            //theme.res has hideLeftSideMenuBool set to false
            theme = Resources.openLayered("/theme");
            UIManager.getInstance().setThemeProps(theme.getTheme(theme.getThemeResourceNames()[0]));
            UIManager.getInstance().getLookAndFeel().setMenuBarClass(SideMenuBar.class);
            Display.getInstance().setCommandBehavior(Display.COMMAND_BEHAVIOR_SIDE_NAVIGATION);
            current.refreshTheme();
        }catch(IOException e){
            Log.p(e.toString());
        }
    }
    return true;
  }
});

只使用工具栏api,不需要调用或更改任何主题常量

将工具栏设为最终工具栏,或在
beforeShow()方法之外声明它,以便可以在内部方法
shouldNavigate(字符串url)
中访问它

您只需调用
removeAll()
,然后重置标题并添加所需的组件。若工具栏并没有命令或标题,那个么默认情况下它是隐藏的

wb.setBrowserNavigationCallback(new BrowserNavigationCallback() {
    public boolean shouldNavigate(String url) {
        if ((url.indexOf("users/login") != -1)) {
            toolbar.removeAll();
            toolbar.setTitleComponent(new Label("My Form", "Title"));
            toolbar.getComponentForm().revalidate();
        } else {
            //Do nothing, since I've already add the commands I want earlier
        }
        return true;
    }
});

谢谢,戴蒙德。你的建议使我非常接近。我必须在toolbar.removeAll()之后调用current.revalidate()来触发在清空工具栏后隐藏工具栏。然后我需要新的逻辑来重建工具栏,当它是可见的,但你提供了丢失的链接。非常感谢。