Jj *_*beo 6 java blackberry menu java-me
我需要在我的黑莓应用程序中创建一个自定义菜单,以便我可以管理它的外观.我设法创建了一个自定义菜单,创建了一个扩展a PopupScreen和使用抽象方法MenuItem自定义的类.我将该方法设计为抽象来模拟run()方法.LabelFieldinvokeAction()invokeAction()MenuItem

一切都很好,但我记得一些东西.如果我的老板问我要实现本地MenuItem就像开关应用和关闭.我不认为实现Close将是一个问题,但Switch应用程序和其他本机MenuItem如Show Keyboard,这将给我一个问题.所以我想出另一个解决方案,这是我的代码:
public CustomMenu(MainScreen screen) {
super(vfm);
Menu menu = screen.getMenu(0);
for(int i = 0; i < menu.getSize(); i++){
final MenuItem finalMenu = menu.getItem(i);
vfm.add(new CustomMenuItem(finalMenu.toString(), Field.FOCUSABLE){
protected boolean invokeAction(int action) {
finalMenu.run();
return true;
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的构造函数CustomMenu.我接受一个MainScreen作为我的参数的实例来获取列表MenuItem并将其添加到我现有的列表中CustomMenu.该invokeAction()重写的方法存在着对方run()的方法MenuItem.这是我所做的结果:

我设法把那些本机MenuItem放在我CustomMenu的MenuItem身上,但问题是当我调用(点击)那些原生(Switch Application,Close)我得到了IllegalStateException.有没有办法实现这些原生的MenuItem?或者一种捕获run()方法MenuItem然后在我的方法中调用它的方法CustomMenu?
从OP获得更多澄清后,我相信正确的答案是你不能按照他们的要求去做......创建你自己的菜单,并以编程方式从内置菜单调用 MenuItem 命令/操作。
如果我理解正确的话,您想要的是创建自己的菜单,但您不想使用内置的黑莓菜单,因为您的菜单需要看起来不同?
如果是这样的话,那么我会建议另一种方法。我认为 BlackBerry希望您执行此操作的方式是将MenuItem 对象正常添加到内置菜单Screen,但然后在类的方法中更改菜单的各种属性makeMenu():
protected void makeMenu(Menu menu, int context)
Run Code Online (Sandbox Code Playgroud)
以下是有关执行此操作的 BlackBerry 文档,这里是一个示例,其中结合了添加上面显示的菜单项以及对菜单外观的一些更改。希望您发现这是一种更简单的方法来执行您想要的操作,而无需将内置菜单中的 MenuItems链接到您的菜单项:
public class MenuScreen extends MainScreen {
private Background _menuBackground;
private Border _menuBorder;
private Font _menuFont;
private MenuItem _customMenuItems[];
public MenuScreen() {
setTitle("Custom Menu Sample");
getMainManager().setBackground(BackgroundFactory.createSolidBackground(Color.BLACK));
RichTextField f = new RichTextField("Creating a custom menu") {
protected void paint(Graphics g) {
int oldColor = g.getColor();
g.setColor(Color.WHITE);
super.paint(g);
g.setColor(oldColor);
}
};
add(f);
// Customize the look (border/color/font) of the BB menu here:
XYEdges thickPadding = new XYEdges(10, 10, 10, 10);
_menuBorder = BorderFactory.createRoundedBorder(thickPadding, Border.STYLE_DOTTED);
_menuBackground = BackgroundFactory.createSolidTransparentBackground(Color.DARKMAGENTA, 80);
try
{
FontFamily family = FontFamily.forName("BBCasual");
_menuFont = family.getFont(Font.PLAIN, 30, Ui.UNITS_px);
}
catch (final ClassNotFoundException cnfe)
{
UiApplication.getUiApplication().invokeLater(new Runnable()
{
public void run()
{
Dialog.alert("FontFamily.forName() threw " + cnfe.toString());
}
});
}
// Add our own menu items, too
_customMenuItems = new MenuItem[3];
_customMenuItems[0] = new MenuItem("Hola Dora!", 110, 10) {
public void run() {
Dialog.inform("Hola Dora!");
}
};
_customMenuItems[1] = new MenuItem("Close popup!", 111, 10) {
public void run() {
Dialog.inform("Close popup!");
}
};
_customMenuItems[2] = new MenuItem("Hola Diego!", 112, 10) {
public void run() {
Dialog.inform("Hola Diego!");
}
};
addMenuItem(_customMenuItems[0]);
addMenuItem(_customMenuItems[1]);
addMenuItem(_customMenuItems[2]);
}
protected void makeMenu(Menu menu, int context)
{
menu.setBorder(_menuBorder);
menu.setBackground(_menuBackground);
menu.setFont(_menuFont);
// invoking super.makeMenu() will add {Close, Switch Application, etc.} items
super.makeMenu(menu, context);
}
}
Run Code Online (Sandbox Code Playgroud)

注意:如果您只需支持 OS 6.0 及更高版本,您还有其他一些选择(请告诉我们)。另外,您编写自己的菜单的动机可能是因为您想更改字体颜色,我认为您无法使用上面显示的代码来做到这一点。再次强调,如果这是您设计的一部分,请告诉我们。谢谢。