Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Blackberry 调用drawtext()时如何自定义换行?_Blackberry_Newline_Drawtext - Fatal编程技术网

Blackberry 调用drawtext()时如何自定义换行?

Blackberry 调用drawtext()时如何自定义换行?,blackberry,newline,drawtext,Blackberry,Newline,Drawtext,这是一个列表字段 public class Custom_ListField extends ListField { private String[] title, category, date, imagepath; private int[] newsid, catsid; private List_News newslist; private Bitmap imagebitmap[], localimage = Bitmap .getBitmapResource("imag

这是一个列表字段

public class Custom_ListField extends ListField {
private String[] title, category, date, imagepath;
private int[] newsid, catsid;
private List_News newslist;
private Bitmap imagebitmap[], localimage = Bitmap
        .getBitmapResource("image_base.png");
private BrowserField webpage;
private Custom_BrowserFieldListener listener;
private boolean islatest;

private Vector content = null;
private ListCallback callback = null;

private int currentPosition = 0;

public Custom_ListField(Vector content, boolean islatest) {
    this.content = content;
    this.islatest = islatest;
    newsid = new int[content.size()];
    title = new String[content.size()];
    category = new String[content.size()];
    date = new String[content.size()];
    imagepath = new String[content.size()];
    catsid = new int[content.size()];
    imagebitmap = new Bitmap[content.size()];

    for (int i = 0; i < content.size(); i++) {
        newslist = (List_News) content.elementAt(i);
        newsid[i] = newslist.getID();
        title[i] = newslist.getNtitle();
        category[i] = newslist.getNewCatName();
        date[i] = newslist.getNArticalD();
        imagepath[i] = newslist.getImagePath();

        if (!imagepath[i].toString().equals("no picture")) {
            imagebitmap[i] = Util_ImageLoader.loadImage(imagepath[i]);
        } else {
            imagebitmap[i] = localimage;
        }
        catsid[i] = newslist.getCatID();
    }

    initCallbackListening();
    this.setRowHeight(localimage.getHeight() + 10);
}

private void initCallbackListening() {
    callback = new ListCallback();
    this.setCallback(callback);
}

private class ListCallback implements ListFieldCallback {

    public ListCallback() {
        setBackground(Config_GlobalFunction
                .loadbackground("background.png"));
    }

    public void drawListRow(ListField listField, Graphics graphics,
            int index, int y, int width) {
        currentPosition = index;
        graphics.drawBitmap(
                Display.getWidth() - imagebitmap[index].getWidth() - 5,
                y + 3, imagebitmap[index].getWidth(),
                imagebitmap[index].getHeight(), imagebitmap[index], 0, 0);
        graphics.setColor(Color.WHITE);
        graphics.drawRect(0, y, width, imagebitmap[index].getHeight() + 10);



        graphics.setColor(Color.BLACK);
        graphics.setFont(Font.getDefault().derive(Font.BOLD, 20));
        graphics.drawText(title[index], 5, y + 3, 0, Display.getWidth()
                - imagebitmap[index].getWidth() - 10);

        graphics.setColor(Color.GRAY);
        graphics.setFont(Font.getDefault().derive(Font.BOLD, 15));
        graphics.drawText(date[index], 5, y + 6
                + Font.getDefault().getHeight() + 3);

        if (islatest) {
            graphics.setColor(Color.RED);
            graphics.setFont(Font.getDefault().derive(Font.BOLD, 15));
            graphics.drawText(category[index], Font.getDefault()
                    .getAdvance(date[index]) + 3, y + 6
                    + Font.getDefault().getHeight() + 3);
        }
    }

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

    public int getPreferredWidth(ListField listField) {
        return Display.getWidth();
    }

    public int indexOfList(ListField listField, String prefix, int start) {
        return content.indexOf(prefix, start);
    }
}

public int getCurrentPosition() {
    return currentPosition;
}

protected boolean navigationClick(int status, int time) {
    int index = getCurrentPosition();
    if (catsid[index] == 9) {
        if (Config_GlobalFunction.isConnected()) {
            webpage = new BrowserField();
            listener = new Custom_BrowserFieldListener();
            webpage.addListener(listener);

            MainScreen aboutus = new Menu_Aboutus();
            aboutus.add(webpage);
            Main.getUiApplication().pushScreen(aboutus);

            webpage.requestContent("http://www.orientaldaily.com.my/index.php?option=com_k2&view=item&id="
                    + newsid[index] + ":&Itemid=223");
        } else
            Config_GlobalFunction.Message(Config_GlobalFunction.nowifi, 1);
    } else
        Main.getUiApplication().pushScreen(
                new Main_NewsDetail(newsid[index]));
    return true;
}
}
这将仅绘制文本一行。我做了调查,发现没有内置的功能,必须自定义一个功能,使文本自动下一行

函数是这样的

private int numberoflines(int availablespace){
    ...
    return numberlines
}

Rupak显示的链接很好,尽管其中一个引用了通用Java问题(并提出了需要为BlackBerry更改的Swing结果),而另一个引用了外部(非堆栈溢出)链接

如果您需要另一个选项,并且不希望算法计算出在哪里进行换行,您可以使用此选项。此代码假定您将“\n”字符放入字符串中,您希望将文本拆分为多行。您可能会将此代码放在
paint()
方法中:

//存储原始颜色,以便在结束时将其重置
int oldColor=graphics.getColor();
图形.设置颜色(颜色.黑色);
graphics.setFont(_fieldFont);
int endOfLine=_text.indexOf('\n');
if(内氟林<0){
graphics.drawText(_text,_padding,_top);
}否则{
//这是一个多行标签
int top=_top;
int指数=0;
int textLength=_text.length();
while(索引
在这里,您将初始化我在其中使用的一些变量。根据您发布的代码,我认为这些是正确的,但您需要再次检查:

String _text=title[index];//要绘制的文本
int _padding=5;//文本周围的左右侧填充
int _top=y+3;//文本顶部的y坐标
Font _fieldFont=Font.getDefault().derivate(Font.BOLD,20);
//为文本保留的总宽度,包括填充空间:
int _fieldWidth=Display.getWidth()-imagebitmap[index].getWidth();

检查此答案-。同时检查此项。它不起作用,文本仍与图像重叠。这是否支持utf-8文本?我的文字是中文。@AlanLai,我以为你的问题是你需要在多行上显示文字?上面的代码只是将包含“\n”字符的文本拆分为多行。它与绘制位图没有任何关系。如果文本与位图不正确重叠,则传递给
drawText()
的x和y值肯定是错误的。在我的示例中,这些值是
\u padding
top
。看看这些,移动它们,直到它们在你的图像上。我不确定
drawText()和UTF-8字符。但是,这和你在问题中使用的方法是一样的,我明白了。我想要的是一个函数,它将文本绘制成多行,并返回文本的高度texts@AlanLai,您希望高度为(1)像素总数,还是(2)线条数?如果需要总像素数,是希望行数乘以字体高度,还是希望结果包括行之间的垂直填充/间距?这就是我想要的。查看图像旁边的黑色文本。它是
标题[索引]
private int numberoflines(int availablespace){
    ...
    return numberlines
}