黑莓 - 如何创建子菜单?

2024-02-11

我想为 BB 应用程序创建子菜单 当我点击菜单项时它显示

Option 1
Option 2
Option 3

当我点击选项 3 时,它应该显示

1
2
3

作为子菜单项..

使用j2me+eclipse


一直想做这个)
替代文本 http://img380.imageshack.us/img380/3874/menugy.jpg http://img380.imageshack.us/img380/3874/menugy.jpg

class Scr extends MainScreen {
    SubMenu menu = new SubMenu();

    public Scr() {

        for (int i = 0; i < 3; i++) {
            SubMenu sMenu = new SubMenu();
            menu.add(new SubMenuItem(i + " item", sMenu));
            for (int k = 0; k < 3; k++) {
                SubMenu sSMenu = new SubMenu();
                sMenu.add(new SubMenuItem(i + "-" + k + " item", sSMenu));
                for (int l = 0; l < 3; l++) {
                    sSMenu
                            .add(new SubMenuItem(i + "-" + k + "-" + l
                                    + " item"));
                }
            }
        }

        add(new LabelField("testing menu", FOCUSABLE) {
            protected void makeContextMenu(ContextMenu contextMenu) {
                menu.mRectangle.x = this.getContentRect().X2();
                menu.mRectangle.y = this.getContentRect().Y2();
                Ui.getUiEngine().pushScreen(menu);

                EventInjector.invokeEvent(new KeyEvent(KeyEvent.KEY_DOWN,
                        Characters.ESCAPE, 0));
            }
        });
    }
}

class SubMenu extends PopupScreen implements ListFieldCallback {
    private static final int MAX_WIDTH = Font.getDefault().getAdvance(
            "max menu item text");
    XYRect mRectangle = new XYRect();
    Vector mSubMenuItems = new Vector();
    ListField mListField;

    public SubMenu() {
        super(new SubMenuItemManager(), DEFAULT_CLOSE);
        int rowHeight = getFont().getHeight() + 2;
        mListField = new ListField() {
            protected boolean navigationClick(int status, int time) {
                runMenuItem(getSelectedIndex());
                return super.navigationClick(status, time);
            }
        };
        mListField.setRowHeight(rowHeight);
        add(mListField);
        mListField.setCallback(this);
        updateMenuItems();
    }

    public void add(SubMenuItem subMenuItem) {
        mSubMenuItems.addElement(subMenuItem);
        subMenuItem.mMenu = this;
        updateMenuItems();
    }

    private void updateMenuItems() {
        int rowCounts = mSubMenuItems.size();
        mRectangle.width = getMaxObjectToStringWidth(mSubMenuItems);
        mRectangle.height = mListField.getRowHeight() * rowCounts;
        mListField.setSize(rowCounts);
    }

    private void runMenuItem(int index) {
        SubMenuItem item = (SubMenuItem) get(mListField, index);
        if (null != item.mSubMenu) {
            item.mSubMenu.setSubMenuPosition(getSubMenuRect(index));
            Ui.getUiEngine().pushScreen(item.mSubMenu);
        } else {
            item.run();
        }
    }

    private XYRect getSubMenuRect(int index) {
        SubMenuItem item = (SubMenuItem) get(mListField, index);
        XYRect result = item.mSubMenu.mRectangle;
        result.x = mRectangle.x + mRectangle.width;
        result.y = mRectangle.y + mListField.getRowHeight() * index;
        int testWidth = Display.getWidth() - (mRectangle.width + mRectangle.x);
        if (testWidth < result.width) {
            result.width = testWidth;
        }

        int testHeight = Display.getHeight()
                - (mRectangle.height + mRectangle.y);
        if (testHeight < result.height)
            result.height = testHeight;

        return result;
    }

    public void setSubMenuPosition(XYRect rect) {
        mRectangle = rect;
    }

    protected void sublayout(int width, int height) {
        super.sublayout(mRectangle.width, mRectangle.height);
        setPosition(mRectangle.x, mRectangle.y);
        setExtent(mRectangle.width, mRectangle.height);
    }

    private int getMaxObjectToStringWidth(Vector objects) {
        int result = 0;
        for (int i = 0; i < objects.size(); i++) {
            int width = getFont().getAdvance(objects.elementAt(i).toString());
            if (width > result) {
                if (width > MAX_WIDTH) {
                    result = MAX_WIDTH;
                    break;
                } else {
                    result = width;
                }
            }
        }
        return result;
    }

    public void drawListRow(ListField field, Graphics g, int i, int y, int w) {
        // Draw the text.
        String text = get(field, i).toString();
        g.setColor(Color.WHITE);
        g.drawText(text, 0, y, DrawStyle.ELLIPSIS, w);
    }

    public Object get(ListField listField, int index) {
        return mSubMenuItems.elementAt(index);
    }

    public int getPreferredWidth(ListField listField) {
        return mRectangle.width;
    }

    public int indexOfList(ListField listField, String prefix, int start) {
        return 0;
    }
}

class SubMenuItemManager extends VerticalFieldManager {
    public SubMenuItemManager() {
        super(USE_ALL_HEIGHT | USE_ALL_WIDTH);
    }

    public int getPreferredWidth() {
        return ((SubMenu) getScreen()).mRectangle.width;
    }

    public int getPreferredHeight() {
        return ((SubMenu) getScreen()).mRectangle.height;
    }

    protected void sublayout(int maxWidth, int maxHeight) {
        maxWidth = getPreferredWidth();
        maxHeight = getPreferredHeight();
        super.sublayout(maxWidth, maxHeight);
        setExtent(maxWidth, maxHeight);
    }

}

class SubMenuItem implements Runnable {
    String mName;
    SubMenu mMenu;
    SubMenu mSubMenu;

    public SubMenuItem(String name) {
        this(name, null);
    }

    public SubMenuItem(String name, SubMenu subMenu) {
        mName = name;
        mSubMenu = subMenu;
    }

    public String toString() {
        return mName;
    }

    public void run() {

    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

黑莓 - 如何创建子菜单? 的相关文章

  • 按下按钮并在java中的新窗口中打开文件

    我创建了一个 JFrame 并放置了一个文本字段和按钮 在文本字段中我放置了从文本文件读取的名称 我知道我想单击按钮并打开一个已知窗口 我想在其中放置名称 其他信息来自同一个文件 这是我的代码 这是我的主框架 package Fronten
  • 我的 Powershell GUI 界面在打开网格视图时不断调整大小

    我目前正在构建一个复制到剪贴板工具 其中显示存储在文件夹中的 txt 文件列表 并且我使用 out gridview 来允许用户更好地选择和过滤列表 我已附上图片以供参考 单击加载 out gridview 的按钮后如何停止调整大小 Too
  • 拦截jTable选择改变事件

    I found 这个论坛主题 http www javakb com Uwe Forum aspx java programmer 2407 Row non selectable in a JTable这建议重写 ListSelection
  • .NET UI 元素线程限制的原因

    我们知道 除了实例化元素的线程之外 不可能从任何线程执行操作任何 UI 元素属性的代码 我的问题是 为什么 我记得当我们使用 COM 用户界面元素时 在 COM Visual Basic 6 0 时代 所有 UI 元素都是使用 COM 类和
  • Java 和 GUI - 根据 MVC 模式,ActionListener 属于哪里?

    我目前正在编写一个模板 Java 应用程序 不知何故 如果我想完全遵循 MVC 模式 我不确定 ActionListener 属于哪里 该示例基于 Swing 但它不是关于框架 而是关于 Java 中 MVC 的基本概念 使用任何框架创建
  • 在哪里可以找到 WPF 应用程序中 UI 的一些主题/演示?

    我想使用 xaml 中的 Visual Studio Designer 设计一个现代外观的 UI 它为我提供了一个很好的工具箱 我可以使用它通过拖放来直观地创建 UI 由于它几乎表现得像 HTML 我想知道它是否也有丰富的主题库 我找到了一
  • 黑莓上的视频流

    有没有办法从服务器流式传输和播放视频文件 黑莓是否提供可以播放流视频的内置视频播放器 是的你可以 在 bb 设备上串流视频有两种方法 使用 jsr 135 中的 javax microedition media Player 使用标准媒体应
  • 如何为 BlackBerry 10 准备旧的 Blackberry 应用程序?

    我们有几个 Blackberry 应用程序 现在正在尝试为 BB 10 做好准备 这些应用程序是通过 Eclipse 和 或 RIM IDE 工具用 Java 制作的 然而 当我去https developer blackberry com
  • 如何创建像谷歌位置历史记录一样的Android时间轴视图?

    我想设计像谷歌位置历史这样的用户界面 我必须为我正在使用的应用程序复制此 UIRecyclerView 每行都是水平的LinearLayout其中包含右侧的图标 线条和视图 该线是一个FrameLayout具有圆形背景和半透明圆圈Views
  • 用于推送通知的设备令牌

    我正在实施推送通知服务 我需要创建一个数据库来存储 4 个移动平台的所有设备令牌 我想根据他们的平台 iOS Android BlackBerry WP7 来组织它们 但是有什么方法可以区分平台 这样如果我只想向 Android 用户发送消
  • J2ME 的 GZIPInputStream 实现

    是否有适用于 J2ME 的 GZIPInputStream 实现 我更喜欢 Apache 风格许可证 IIRC 的电话ME项目 https phoneme dev java net 包括一个实现GZIP输入流 http jcs mobile
  • 优雅降级 - 何时考虑

    在为使用 AJAX 的应用程序设计和构建 UI 时 您何时考虑优雅降级 对于禁用 JavaScript 或正在使用屏幕阅读器的用户 最后 网站的 AJAX 版本完全完成后 在每个发展阶段 I don t 还有别的事 这些日子 渐进增强 ht
  • 来自另一个类的 Qt C++ GUI 调用

    我通过 gui 拖放创建了一个按钮和一个文本浏览器 UI 以及单击按钮功能是在 mainwindow cpp 中创建的 有一个 main cpp 但这是无关紧要的 因为在单击开始按钮之前程序不会启动 include mainwindow h
  • Python Tkinter,显示实时数据

    我想在 GUI 中显示实时数据tkinter 我得到的数据包含list两个整数的 current voltage 我每秒都在获取新数据 我成功创建了一个 GUI 现在我想知道如何在 GUI 中显示数据Label小部件 python tkin
  • C++ GUI 桌面 Windows 应用程序的测试自动化工具/库/框架

    不幸的是 我有一个在 Windows 上运行的 GUI 桌面应用程序 并使用 Borland C 编译器进行编译 我知道这是一项非常古老的技术 但这就是生活 我工作的公司有很多免费的 QTP 许可证 但说实话 我不喜欢这个工具 我想用一些开
  • 如何制作一个向用户显示图像而不是文本的下拉列表?

    ObjectChoiceField 字段满足我的所有要求 但它并不漂亮 这就是我所拥有的 String pets Dog Cat Duck ObjectChoiceField dd new ObjectChoiceField My Pet
  • 触摸屏上最小的按钮尺寸

    我参与为医疗设备编写触摸屏应用程序 该程序类似于信息亭 因为用户无法访问开始菜单等 并且用户将使用屏幕键盘在他们需要的罕见情况下键入任何文本 规格屏幕尺寸为 1280x1024 问题是 一个合理的界面的最小可触摸按钮尺寸是多少 我认为美国一
  • 用户界面上的“ID”或“Id”

    我工作的 QA 经理刚刚告诉我 我的桌面应用程序存在一个错误 因为登录提示应该是 操作员 ID 而却是 操作员 ID 她的论点是 本我 指的是弗洛伊德 精神装置 的自我部分 在语义上是不正确的 现在 作为一名肛门工程师 AE 我当然必须去查
  • Java setLocation() 事故

    我正处于创建一个程序来操作员工 客户系统的开始阶段 现在我刚刚创建了登录 GUI 但我遇到了一些问题 setLocation 方法 我将其设置为 250 250 但这使我的 GUI 高度变得非常疯狂 如果有人能够解决这个问题 我的代码如下
  • JTable过滤后正确的行号

    这是一个 try 块 用于过滤 table job 以查找与关键字匹配的行 但是 当表模型发生变化时 我很难获得正确的行索引 它始终选择第一行 即使过滤结果显示的行不是第一行 我知道你可以做一些事情fireTableDataChanged

随机推荐