BlackBerry 在 TreeField 或 ListField 中的水平滚动

Posted

技术标签:

【中文标题】BlackBerry 在 TreeField 或 ListField 中的水平滚动【英文标题】:BlackBerry Horizontal Scrolling in TreeField or ListField 【发布时间】:2010-03-13 04:30:14 【问题描述】:

我正在开发一个应用程序,该应用程序需要大于 TreeField 和 ListField 中的可视屏幕大小的文本。如您所知,TreeField 和 ListField 回调仅支持 graphics.drawText() 方法,所以我不能每行添加一个 Field 的实例。

有没有人可以水平滚动超过可视文本大小的方法?

是否有可以工作的可滚动面板?我知道 NullField(Field.Focusable) 技巧,但这不适用于列表字段。

最后,我知道屏幕类型会有所不同,因为 FullScreen 和 MainScreen 使用 VerticalFieldMangers。所以我目前正在使用 PopupScreen 进行测试。

提前感谢您的宝贵时间。

【问题讨论】:

【参考方案1】:

也许最好将文本分成两行并将行高设置为 2 x 字体高度(+边距)?

alt text http://img219.imageshack.us/img219/5802/listh.jpg

class Scr extends MainScreen implements ListFieldCallback 
    int DISPLAY_WIDTH = Display.getWidth();
    Vector mItems = new Vector();   
    ListField mListField = new ListField();

    public Scr() 
        mListField.setCallback(this);
        add(mListField);
        mItems.addElement("Lorem ipsum dolor sit amet, ");
        mItems.addElement("Lorem ipsum dolor sit");
        mItems.addElement("Lorem ipsum dolor sit amet, "+
            "consectetuer adipiscing elit");
        mItems.addElement("Lorem ipsum dolor sit amet, "+
            "consectetuer adipiscing elit, sed diam "+
                "nonummy nibh euismod");
        mItems.addElement("Lorem ipsum dolor sit amet, "+
            "consectetuer adipiscing elit");
        mItems.addElement("Lorem ipsum dolor sit amet, ");
        mListField.setSize(mItems.size());
        mListField.setRowHeight(
                mListField.getFont().getHeight()*2 + 4);        
    

    public void drawListRow(ListField field, Graphics g, 
        int i, int y, int w) 
        // Draw the text.
        String text = (String) get(field, i);        
        if(g.getFont().getAdvance(text) > w)
        
            int index = 0;
            while(g.getFont().getAdvance(text.substring(0, index)) < w)
            
                index++;
            
            g.drawText(text.substring(0, index), 0, y, 0, w);
            g.drawText(text.substring(index, text.length()-1), 0, 
            y + g.getFont().getHeight()+ 4, DrawStyle.ELLIPSIS, w);
        
        else
        
            g.drawText(text, 0, y, 0, w);
        
           

    public Object get(ListField listField, int index) 
        return mItems.elementAt(index);
    

    public int getPreferredWidth(ListField listField) 
        return DISPLAY_WIDTH;
    

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

【讨论】:

你可能是对的,这似乎不可能有任何其他方式。我在想,如果我可以只将第二行显示在集中的一行上,这将有助于避免屏幕混乱。 好吧,如果你构建一个自定义控件(垂直管理器 + 标签)... ListField 中的行高对于所有行都是相同的((

以上是关于BlackBerry 在 TreeField 或 ListField 中的水平滚动的主要内容,如果未能解决你的问题,请参考以下文章

是否有可能在 Android 或 Blackberry 上运行小程序?

测试适用于 Android 或 BlackBerry 的移动网站

为 Blackberry 或 J2ME (HttpConnection) 寻找经过验证的库

使用 JSR-226 (Blackberry) 渲染存储在内存中的 SVG

适用于 iOS + Android + BlackBerry 的 testflight 等服务

连接 phpmyadmin 和 BlackBerry 应用程序 (Eclipse)