我正在尝试将 LabelField 的背景设置为透明,并且我已经搜索了广泛的解决方案,但到目前为止我尝试过的任何事情似乎都没有奏效。基本上我的问题如下,我有一个带有 TableRowManager 的 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 具有默认的透明背景,所以你错了:

这是我的完整代码:
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();
    }
}
}