Проблема при загрузке БОЛЬШЕ, чем один пользовательский шрифт Blackberry

Я попытался загрузить пользовательский шрифт, который работает. Теперь у меня проблема: я не могу использовать более одного пользовательского шрифта в приложении. Если я добавлю три labelFields, каждое из которых имеет другой шрифт, для всех меток будет использоваться только последний пользовательский шрифт.

Если я удаляю последний setFont для последней метки, используется второй шрифт. Есть ли какой-то механизм, который использует только последний шрифт?

Вот код, который добавляет LabelFields и устанавливает шрифты

        LabelField TestLabel1 = new LabelField("Test Label 1");
    Font fo1 = loadCustomFonts("FirstFont.ttf", "FirstFont", 0, 30);

    TestLabel1.setFont(fo1);
    add(TestLabel1);

    LabelField TestLabel2 = new LabelField("Test Label 2");
    Font fo2 = loadCustomFonts("SecondFont.ttf", "SecondFont", 0, 30);
    TestLabel2.setFont(fo2);
    add(TestLabel2);

    LabelField TestLabel3 = new LabelField("Test Label 3");
    Font fo3 =loadCustomFonts("ThirdFont.TTF", "ThirdFont", 0, 30);
    TestLabel3.setFont(fo3);
    add(TestLabel3);

Вот мой метод "loadCustomFonts", который загружает пользовательский шрифт и возвращает объект шрифта.

 public Font loadCustomFonts (String path, String fontname,int fontStyle, int fontSize){ 
InputStream stream = this.getClass().getResourceAsStream(path);
    if (FontManager.getInstance().load(stream, fontname, FontManager.APPLICATION_FONT) == FontManager.SUCCESS){
        try{
            FontFamily family;
            add(new LabelField("A"));
            family = FontFamily.forName(fontname);
            Font myFont = family.getFont(fontStyle,fontSize);
            return myFont;
        } 
        catch (ClassNotFoundException e){System.out.println(e.getMessage());}
    }
    else {
         try{
             FontFamily family;
             add(new LabelField("B"));
             family = FontFamily.forName(fontname);
             Font myFont = family.getFont(fontStyle,fontSize);
             return myFont;
         } 
         catch (ClassNotFoundException e){System.out.println(e.getMessage());}
    }
    return null;
}   

3 ответа

Я нашел причину. Это был максимальный размер 60 КБ на каждый пользовательский шрифт, и если шрифт уже загружен.

Поэтому я изменил метод загрузчика.

public Font loadCustomFonts (String path, String fontname,int fontStyle, int fontSize){
    //Loads custom Fonts        

        InputStream stream = this.getClass().getResourceAsStream(path);
        System.out.println("fontname"+fontname);

        //System.out.println("fontname"+fontname +"FontManager Return "+FontManager.getInstance().load(path, fontname, FontManager.EXCEEDS_LIMIT));
        if (FontManager.getInstance().load(stream, fontname, FontManager.APPLICATION_FONT) == FontManager.EXCEEDS_LIMIT)
            System.out.println("FontManager.EXCEEDS_LIMIT => true");
        else
            System.out.println("FontManager.EXCEEDS_LIMIT => false");               

        System.out.println (FontManager.DUPLICATE_DATA);

         if (FontManager.getInstance().load(path, fontname, FontManager.APPLICATION_FONT) == FontManager.APPLICATION_FONT) 
         { 
        //if (FontManager.getInstance().load(stream, fontname, FontManager.APPLICATION_FONT) == FontManager.SUCCESS){
            System.out.println("A getInstanc => true");
            try{
                System.out.println("A Try");
                FontFamily family;       
                family = FontFamily.forName(fontname);
                Font myFont = family.getFont(fontStyle,fontSize);
                System.out.println("A  return myFont"+myFont);
                return myFont;
            } 
            catch (ClassNotFoundException e){System.out.println(e.getMessage());}
                System.out.println("A Catch");
        }
        else {
        //font could not be loaded   
             System.out.println("B getInstanc => false");
             System.out.println("FontManager.getInstance().load(path, fontname, FontManager.APPLICATION_FONT"+FontManager.getInstance().load(path, fontname, FontManager.APPLICATION_FONT));
             if (FontManager.getInstance().load(path, fontname, FontManager.APPLICATION_FONT) == FontManager.DUPLICATE_NAME)
            //check if font already is loaded
                 try{
                        System.out.println("B Try");
                        FontFamily family;       
                        family = FontFamily.forName(fontname);
                        Font myFont = family.getFont(fontStyle,fontSize);
                        System.out.println("B  return myFont"+myFont);
                        return myFont;
                    } 
                    catch (ClassNotFoundException e){System.out.println(e.getMessage());}               
            else
                 System.out.println("FontManager.getInstance().load(path, fontname, FontManager.APPLICATION_FONT"+FontManager.getInstance().load(path, fontname, FontManager.APPLICATION_FONT));

         }
        return null;
    }

Кто-нибудь знает решение для загрузки шрифтов, размер которых превышает 60 КБ? Я уже пытался использовать входной поток, но он не работал.

(ограничение "FontManager.EXCEEDS_LIMIT, если размер шрифта превышает 60 КБ". - http://www.blackberry.com/developers/docs/5.0.0api/net/rim/device/api/ui/FontManager.html)

Попробуйте переопределить paint() каждого поля метки и применить setFont внутри него.

       LabelField lf1 = new LabelField("This is font 1"){

        protected void paint(Graphics graphics) 
        {
            setFont( getFont().derive(Font.STYLE_BOLD,15));
            graphics.drawText(getText(), 1, 1);
            super.paint(graphics);

        }
    };

    LabelField lf2 = new LabelField("This is font 2"){

        protected void paint(Graphics graphics) 
        {
            setFont( getFont().derive(Font.STYLE_ITALIC,18));
            graphics.drawText(getText(), 1, 1);
            super.paint(graphics);

        }
    };
    LabelField lf3 = new LabelField("This is font 3"){

        protected void paint(Graphics graphics) 
        {
            setFont( getFont().derive(Font.STYLE_UNDERLINED,20));
            graphics.drawText(getText(), 1, 1);
            super.paint(graphics);

        }
    };

    add(lf1);
    add(lf2);
    add(lf3);
Другие вопросы по тегам