【问题标题】:Customising Blackberry Treefield自定义黑莓树域
【发布时间】:2012-04-03 11:32:15
【问题描述】:

我想自定义出现在树视图左侧的 (+) 号 是否可以 我想把图片放在那个地方

我曾尝试自定义和搜索论坛以及黑莓论坛,其中一个说不可能,但后来
我有一个链接如下所示,这是可能的

http://supportforums.blackberry.com/t5/Java-Development/Custom-TreeField/td-p/354901

HardwareDevice 类似乎缺失的地方

任何人都可以使用链接或他们自己的任何其他答案来解释这个概念吗 请建议?

【问题讨论】:

    标签: blackberry treeview customization treefield


    【解决方案1】:

    [已更新] 如果您想自定义TreeField 的每一行的 (+) 符号和其他属性而不是编写自己的树字段,那么您可以尝试重写TreeFieldCallbackdrawTreeItem 方法,如下所示:

    import net.rim.device.api.system.Bitmap;
    import net.rim.device.api.system.Display;
    import net.rim.device.api.ui.Field;
    import net.rim.device.api.ui.Graphics;
    import net.rim.device.api.ui.component.LabelField;
    import net.rim.device.api.ui.component.TreeField;
    import net.rim.device.api.ui.component.TreeFieldCallback;
    import net.rim.device.api.ui.container.MainScreen;
    import net.rim.device.api.ui.container.VerticalFieldManager;
    
    public class TreeDemo extends MainScreen {
        int parent[] = {1,2,3,4,5,6,7,8,9};
        int child[][] = new int [10][10];
        int child_child[][][] = new int [10][10][10];
    
        int rowHeight = 27;
    
        CustomTreeFieldCallback treeCallback = new CustomTreeFieldCallback();
        VerticalFieldManager vm = new VerticalFieldManager(Field.FOCUSABLE | VERTICAL_SCROLL | VERTICAL_SCROLLBAR);
        TreeField myTree = new TreeField(treeCallback, Field.FOCUSABLE);
    
        public TreeDemo() {
            vm.add(new LabelField("Table:"));
            myTree.setRowHeight(rowHeight);
            myTree.setIndentWidth(15);
            myTree.setDefaultExpanded(false);
            for(int i = parent.length-1; i >= 0 ; i--) {
                parent[i] = myTree.addChildNode(0, "Parent_" + (i+1));
                child[i] = new int[4];
                for(int j = child[i].length-1; j >=0 ; j--) {
                    child[i][j] = myTree.addChildNode(parent[i], "Child_"+ (i+1) + "_" + (j+1));
                    child_child[i][j] = new int[3];
                    for(int k = child_child[i][j].length-1; k >= 0 ; k--) {
                        child_child[i][j][k] = myTree.addChildNode(child[i][j], "Child_of_Child_"+ (i+1) + "_" + (j+1)+ "_" + (k+1));
                    }
                }
            }
            vm.add(myTree);
            add(vm);
        }
    
        private class CustomTreeFieldCallback implements TreeFieldCallback {
    
            public void drawTreeItem(TreeField treeField, Graphics graphics, int node,
                    int y, int width, int indent) {
                // TODO Auto-generated method stub
                String string = (String) treeField.getCookie(node);
                int preservedColor = graphics.getColor();
    
                if(treeField.getCurrentNode() == node) {
                    graphics.setColor(0x0CCCC0);
                } else {
                    graphics.setColor(0x404040);
                }
                graphics.fillRect(0, y, Display.getWidth(), treeField.getRowHeight());
    
                Bitmap iconImage;
                int iconImageWidth = 0;
                indent -= 20; // decrease the extra indentation for all nodes.
                if(treeField.getFirstChild(node) != -1){ // if the node is not a leaf node
                    if(treeField.getExpanded(node)) {
                        iconImage = Bitmap.getBitmapResource("icon_arrow_down.png");
                        iconImageWidth = iconImage.getWidth();
                    } else {
                        iconImage = Bitmap.getBitmapResource("icon_arrow_right.png");
                        iconImageWidth = iconImage.getWidth();
                    }
                    graphics.drawBitmap(indent, y, indent+iconImageWidth, treeField.getRowHeight(), iconImage, 0, 0);
                }
    
                if( treeField.getCurrentNode() == node ) {
                    graphics.setColor(0x404040);            
                } else {
                    graphics.setColor(0x0CCCC0);
                }
                graphics.drawText(string, indent+iconImageWidth, y);
    
                graphics.setColor(preservedColor);
            }
    
        }
    }
    

    【讨论】:

    • 好的!!!! ..很酷的代码@HeartBeat:但是如果子节点中有子节点,它会被覆盖吗?
    • @Yatin K,之前的代码也支持“子节点内的子节点”,但是我之前没有考虑到缩进的小问题。现在我已经更新了代码并修复了这个问题,检查一下!!
    • 您好,请回答以下与此问题相关的问题。 stackoverflow.com/questions/17723328/…
    • 这篇文章似乎主要是 this blog post 的副本。如果您使用其他人的工作来创建您的答案,您需要通过链接引用它。
    • 感谢您提及@Nate。事实上,testberry 实际上是“我的”自己的博客,您可能错过了在发布此答案一天后发布的博客文章。 :-)
    【解决方案2】:

    试试下面这个带有图像的自定义 treeField 代码

    import net.rim.device.api.system.Bitmap;
    import net.rim.device.api.system.Display;
    import net.rim.device.api.ui.Field;
    import net.rim.device.api.ui.FieldChangeListener;
    import net.rim.device.api.ui.Manager;
    import net.rim.device.api.ui.UiApplication;
    import net.rim.device.api.ui.component.BitmapField;
    import net.rim.device.api.ui.component.LabelField;
    import net.rim.device.api.ui.component.SeparatorField;
    import net.rim.device.api.ui.container.HorizontalFieldManager;
    import net.rim.device.api.ui.container.MainScreen;
    import net.rim.device.api.ui.container.VerticalFieldManager;
    
    /**
     * A class extending the MainScreen class, which provides default standard
     * behavior for BlackBerry GUI applications.
     */
    public final class MyScreen extends MainScreen implements FieldChangeListener
    {
        /**
         * Creates a new MyScreen object
         */
        private VerticalFieldManager main_manager;
        private HorizontalFieldManager parentNodes;
        private LabelField parent_lables[];
        private Bitmap bitmap,upbitmap;
        private BitmapField bitmap_field[];
        private VerticalFieldManager submanager[];
        private int sizeOfParentNodes=3;
        private int sizeOfChildNodes=5;
        private static boolean flag[];
    
        public MyScreen()
        {        
            // Set the displayed title of the screen       
            bitmap=Bitmap.getBitmapResource("arrow.png");
            upbitmap=Bitmap.getBitmapResource("uparrow.png");
            main_manager=new VerticalFieldManager(Manager.VERTICAL_SCROLL|VERTICAL_SCROLLBAR){
                protected void sublayout(int maxWidth, int maxHeight) {
                    super.sublayout(Display.getWidth(), Display.getHeight());
                    setExtent(Display.getWidth(), Display.getHeight());
                };
            };
            parent_lables=new LabelField[sizeOfParentNodes];
            flag=new boolean[sizeOfParentNodes];
            submanager=new VerticalFieldManager[sizeOfParentNodes];
            bitmap_field=new BitmapField[sizeOfParentNodes];
            for(int i=0;i<sizeOfParentNodes;i++)
            {
                submanager[i]=new VerticalFieldManager();
                updateGUI(i);
                main_manager.add(submanager[i]);
            }
    
            add(main_manager);
    
    
        }
        public void fieldChanged(Field field, int context) {
            // TODO Auto-generated method stub
            synchronized (UiApplication.getEventLock()) {
                for(int i=0;i<sizeOfParentNodes;i++)
                {   if(field==parent_lables[i])
                    {
                        if(flag[i]==true){
                            flag[i]=false;
                            submanager[i].deleteAll();
                            updateGUI(i);
                            parent_lables[i].setFocus();
                        }else{
                            flag[i]=true;
                            bitmap_field[i].setBitmap(upbitmap);
                            for(int j=0;j<sizeOfChildNodes;j++)
                            {
                                submanager[i].add(new LabelField("        Child :"+i+","+j,Field.FOCUSABLE));
                                submanager[i].add(new SeparatorField());
                            }
                            submanager[i].invalidate();
                        }
    
                    }
                }
            }
    
    
        }
        public void updateGUI(int index)
        {
            parentNodes=new HorizontalFieldManager(USE_ALL_WIDTH);
            bitmap_field[index]=new BitmapField(bitmap);
    
            parentNodes.add(bitmap_field[index]);
            parent_lables[index]=new LabelField("Day"+index,Field.FOCUSABLE){
                protected boolean navigationClick(int status, int time) {
                    fieldChangeNotify(1);
                    return true;
                };
            };
            parentNodes.add(parent_lables[index]);
            parent_lables[index].setChangeListener(this);
            submanager[index].add(parentNodes);
        }
    }
    

    你可以得到输出为

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多