Java 如何在Codename one中动态设置SideMenuBar的可见性?
使用codenameone中的Toolbar类,如何动态设置SideMenuBar的可见性 我使用的是WebBrowser组件,我只希望在登录后可以访问侧菜单 当我在侧菜单栏上简单地放置命令时,我实现了我想要的行为(方法1),但是现在我已经切换到使用工具栏类来实现LnF优势(方法2),似乎没有观察到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
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()来触发在清空工具栏后隐藏工具栏。然后我需要新的逻辑来重建工具栏,当它是可见的,但你提供了丢失的链接。非常感谢。