LabelField setBackground透明背景

时间:2013-02-15 12:49:09

标签: java blackberry

我正在尝试将LabelField的背景设置为透明,并且我在搜索范围内寻找解决方案,但到目前为止我所尝试的内容似乎都没有用。基本上我的问题如下,我有一个TableFow的ListField,我将标签添加到表行管理器,然后在表行管理器的绘制行中绘制它们。但我正在实例化我的LabelField,如下所示:

LabelField address = new LabelField(e.Address, DrawStyle.ELLIPSIS
                | FOCUSABLE) {

            public void paint(Graphics g) {
                g.setGlobalAlpha(255);
                g.setColor(Color.WHITE);
                g.clear();
                super.paint(g);
            }

            protected void paintBackground(Graphics g) {

                g.setGlobalAlpha(0);
                g.setBackgroundColor(Color.BLACK);
                g.clear();
                super.paint(g);

            }

            public int getPreferredWidth() {
                return Display.getWidth() - 100;
            }

            protected void layout(int maxWidth, int maxHeight) {
                super.layout(getPreferredWidth(), maxHeight);
                setExtent(getPreferredWidth(), getHeight());
            }

        };
        address.setBackground(BackgroundFactory
                .createSolidTransparentBackground(0, 0));

上面给了我一个黑色背景的LabelField很好,直到我把焦点放在那一行上,我不能用黑色进行onFocus覆盖,因为我需要让用户知道他目前关注的位置

修改

我将上面的代码更改为:

LabelField name = new LabelField(e.Name,
                DrawStyle.ELLIPSIS | FOCUSABLE){

public void paint(Graphics g) {

    g.setColor(Color.WHITE);
    g.clear();
    super.paint(g);
}
};

因为他在回答中说LabelField和EditField有默认的透明背景,所以你错了:

Screenshot of ListField

这是我的完整代码:

import java.util.Vector;
import net.rim.device.api.collection.List;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.DrawStyle;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.XYRect;
import net.rim.device.api.ui.component.BitmapField;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.ListField;
import net.rim.device.api.ui.component.ListFieldCallback;
import net.rim.device.api.ui.decor.BackgroundFactory;

public class SpecialsListField extends ListField implements ListFieldCallback {

private Bitmap p1;
TableRowManager row;
Vector rows;

public SpecialsListField(List list) {
    /* Init & Declaration */
    setEmptyString("This ListField has No Data", DrawStyle.HCENTER);
    setCallback(this);
    setRowHeight(179);
    Font.getDefault();
    p1 = Bitmap.getBitmapResource("no-image.png");
    rows = new Vector();
    for (int x = 0; x < list.size(); ++x) {
        Special e = (Special) list.getAt(x);

        row = new TableRowManager();

        BitmapField myImageField = new BitmapField(p1);
        row.add(myImageField);

        LabelField name = new LabelField(e.Name, DrawStyle.ELLIPSIS
                | FOCUSABLE) {

            public void paint(Graphics g) {
                g.setGlobalAlpha(255);
                g.setColor(Color.WHITE);
                g.clear();
                super.paint(g);
            }

            protected void paintBackground(Graphics g) {

                g.setGlobalAlpha(0);
                g.setBackgroundColor(Color.BLACK);
                g.clear();
                super.paint(g);

            }
        };

        name.setBackground(BackgroundFactory
                .createSolidTransparentBackground(0, 0));

        row.add(name);

        LabelField date = null;

        if (e.DateFrom.compareTo(e.DateTo) == 0) {
            date = new LabelField(e.DateFrom, DrawStyle.ELLIPSIS
                    | FOCUSABLE) {

                public void paint(Graphics g) {
                    g.setGlobalAlpha(255);
                    g.setColor(Color.WHITE);
                    g.clear();
                    super.paint(g);
                }

                protected void paintBackground(Graphics g) {

                    g.setGlobalAlpha(0);
                    g.setBackgroundColor(Color.BLACK);
                    g.clear();
                    super.paint(g);

                }

            };
            date.setBackground(BackgroundFactory
                    .createSolidTransparentBackground(0, 0));
            row.add(date);
        } else {
            date = new LabelField(e.DateFrom + " - " + e.DateTo,
                    DrawStyle.ELLIPSIS | FOCUSABLE) {

                public void paint(Graphics g) {
                    g.setGlobalAlpha(255);
                    g.setColor(Color.WHITE);
                    g.clear();
                    super.paint(g);
                }

                protected void paintBackground(Graphics g) {

                    g.setGlobalAlpha(0);
                    g.setBackgroundColor(Color.BLACK);
                    g.clear();
                    super.paint(g);

                }

            };
            date.setBackground(BackgroundFactory
                    .createSolidTransparentBackground(0, 0));
            row.add(date);
        }

        LabelField time = null;

        if (e.TimeFrom.compareTo(e.TimeTo) == 0) {
            time = new LabelField(e.TimeFrom, DrawStyle.ELLIPSIS
                    | FOCUSABLE) {
                public void paint(Graphics g) {
                    g.setGlobalAlpha(255);
                    g.setColor(Color.WHITE);
                    g.clear();
                    super.paint(g);
                }

                protected void paintBackground(Graphics g) {

                    g.setGlobalAlpha(0);
                    g.setBackgroundColor(Color.BLACK);
                    g.clear();
                    super.paint(g);

                }

            };

            time.setBackground(BackgroundFactory
                    .createSolidTransparentBackground(0, 0));

            row.add(time);
        } else {
            time = new LabelField(e.TimeFrom + " - " + e.TimeTo,
                    DrawStyle.ELLIPSIS | FOCUSABLE) {

                public void paint(Graphics g) {
                    g.setGlobalAlpha(255);
                    g.setColor(Color.WHITE);
                    g.clear();
                    super.paint(g);
                }

                protected void paintBackground(Graphics g) {

                    g.setGlobalAlpha(0);
                    g.setBackgroundColor(Color.BLACK);
                    g.clear();
                    super.paint(g);
                }

            };
            time.setBackground(BackgroundFactory
                    .createSolidTransparentBackground(0, 0));
            row.add(time);
        }

        LabelField address = new LabelField(e.Address, DrawStyle.ELLIPSIS
                | FOCUSABLE) {

            public void paint(Graphics g) {
                g.setGlobalAlpha(255);
                g.setColor(Color.WHITE);
                g.clear();
                super.paint(g);
            }

            protected void paintBackground(Graphics g) {

                g.setGlobalAlpha(0);
                g.setBackgroundColor(Color.BLACK);
                g.clear();
                super.paint(g);

            }

            public int getPreferredWidth() {
                return Display.getWidth() - 100;
            }

            protected void layout(int maxWidth, int maxHeight) {
                super.layout(getPreferredWidth(), maxHeight);
                setExtent(getPreferredWidth(), getHeight());
            }

        };
        address.setBackground(BackgroundFactory
                .createSolidTransparentBackground(0, 0));
        row.add(address);

        rows.addElement(row);
    }
    setSize(rows.size());
}

public void drawListRow(ListField listField, Graphics graphics, int index,
        int y, int width) {
    // TODO Auto-generated method stub
    SpecialsListField list = (SpecialsListField) listField;
    TableRowManager rowManager = (TableRowManager) list.rows
            .elementAt(index);
    rowManager.drawRow(graphics, 0, y, width, 179);
}

protected void drawFocus(Graphics graphics, boolean on) {
    // get the focus rect area
    XYRect focusRect = new XYRect();
    getFocusRect(focusRect);

    boolean oldDrawStyleFocus = graphics
            .isDrawingStyleSet(Graphics.DRAWSTYLE_FOCUS);
    try {
        if (on) {
            // set the style so the fields in the row will update its color
            // accordingly
            graphics.setDrawingStyle(Graphics.DRAWSTYLE_FOCUS, true);
            int oldColour = graphics.getColor();
            try {
                graphics.setColor(Color.DARKGRAY); // set the color and draw
                                                    // the
                                                    // color
                graphics.fillRect(focusRect.x, focusRect.y,
                        focusRect.width, focusRect.height);
            } finally {
                graphics.setColor(oldColour);
            }
            // to draw the row again

            drawListRow(this, graphics, getSelectedIndex(), focusRect.y,
                    focusRect.width);

        }

    } finally {
        graphics.setDrawingStyle(Graphics.DRAWSTYLE_FOCUS,
                oldDrawStyleFocus);
    }
}

public Object get(ListField listField, int index) {
    // TODO Auto-generated method stub
    return rows.elementAt(index).toString();
}

public int getPreferredWidth(ListField listField) {
    // TODO Auto-generated method stub
    return Graphics.getScreenWidth();
}

public int getRowHeight() {
    // TODO Auto-generated method stub
    return 179;
}

public int getRowHeight(int arg0) {
    // TODO Auto-generated method stub
    return 179;
}

public int indexOfList(ListField listField, String prefix, int start) {
    // TODO Auto-generated method stub
    return -1;
}

protected boolean trackwheelClick(int status, int time) {
    int index = getSelectedIndex();
    Dialog.inform(Integer.toString(index));
    return true;
}

private class TableRowManager extends Manager {
    public TableRowManager() {
        super(0);
    }

    // Causes the fields within this row manager to be layed out then
    // painted.
    public void drawRow(Graphics g, int x, int y, int width, int height) {
        // Arrange the cell fields within this row manager.
        layout(width, height);
        // Place this row manager within its enclosing list.
        setPosition(x, y);
        // Apply a translating/clipping transformation to the graphics
        // context so that this row paints in the right area.
        g.pushRegion(getExtent());
        // Paint this manager's controlled fields.
        subpaint(g);
        /*
         * g.setColor(0xFF0000); g.drawLine(0, height - 1,
         * getPreferredWidth(), height - 1); g.drawLine(40, 0, 40,
         * getPreferredHeight());
         */
        // Restore the graphics context.
        g.popContext();
    }

    // Arrages this manager's controlled fields from left to right within
    // the enclosing table's columns.
    protected void sublayout(int width, int height) {
        // set the size and position of each field.
        int fontHeight = Font.getDefault().getHeight();
        int preferredWidth = getPreferredWidth();
        // start with the Bitmap Field of the priority icon
        Field field = getField(0);
        layoutChild(field, 75, 75);
        setPositionChild(field, 5, 5);
        // set the task name label field
        field = getField(1);
        layoutChild(field, preferredWidth, fontHeight + 2);
        setPositionChild(field, 85, 5);
        // set the list name label field
        field = getField(2);
        layoutChild(field, preferredWidth, fontHeight + 2);
        setPositionChild(field, 85, fontHeight + 6 + 5);
        // set the due time name label field
        field = getField(3);
        layoutChild(field, preferredWidth, fontHeight + 2);
        setPositionChild(field, 100, fontHeight + fontHeight + 8 + 5);

        field = getField(4);
        layoutChild(field, preferredWidth, fontHeight + 2);
        setPositionChild(field, 100, fontHeight + fontHeight + fontHeight
                + 10 + 5);

        setExtent(preferredWidth, getPreferredHeight());
    }

    // The preferred width of a row is defined by the list renderer.
    public int getPreferredWidth() {
        return Graphics.getScreenWidth();
    }

    // The preferred height of a row is the "row height" as defined in the
    // enclosing list.
    public int getPreferredHeight() {
        return 179;// getRowHeight();
    }

}

}

2 个答案:

答案 0 :(得分:0)

我说labelfield从天生就有透明背景,可能并不完全正确。 当labelfield获得焦点时,有蓝色背景无法摆脱,甚至使用此演示代码:

一个简单且独立的helloworld示例。

final class HelloWorldScreen extends MainScreen{
EditField edt = null;

HelloWorldScreen() {
    // set background to black
    this.getMainManager().setBackground(BackgroundFactory.createSolidBackground(Color.BLACK));

    // use to alternate focus
    edt = new EditField("", "");
    add(edt);

    add(new LabelField("test label tranparent", DrawStyle.ELLIPSIS
            | FOCUSABLE) {

        public void paint(Graphics g) {}

        public void applyTheme(){}

        protected void paintBackground(Graphics g) { }
    });

}

}

我重写paint()applyTheme()和paintBackground(),并在那里什么也不做。然而,聚焦的labelfield仍然具有蓝色背景。

是的,另一个WTF的事情。

我建议您使用带有只读样式的editfiled吗?

答案 1 :(得分:0)

要解决聚焦的蓝色背景,您只需覆盖drawFocus并使其为空 protected void drawFocus(Graphics g, boolean on) { }这样就没有什么东西可以被吸引,因为这个领域至少是你想要的。