Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шрифты 
:(
    Опции темы
MegaBitz
Дата 2.8.2009, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 12.7.2009

Репутация: нет
Всего: нет



Проблема вообщем такая не могу считать шрифт с картинки, код компилируется отлично но при запуске появляется ошибка: java.lang.ArrayIndexOutOfBoundsException
at FontClass.drawChar(FontClass.java:52)
at FontClass.drawString(FontClass.java:83)
at MIDPCanvas.paint(MIDPCanvas.java:44)


Вот исходник:

Файл MyFont.java:
Код

import java.io.InputStream;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

/**
 *
 * @author perlovskii
 */
public class MyFont extends MIDlet {
    
    /** Creates a new instance of MyFont */
    public MyFont() {
        initialize();
    }
    
//GEN-LINE:MVDFields
    
//GEN-LINE:MVDMethods

    /** This method initializes UI of the application.//GEN-BEGIN:MVDInitBegin
     */
    private void initialize() {//GEN-END:MVDInitBegin
        // Insert pre-init code here
//GEN-LINE:MVDInitInit
        // Insert post-init code here
    }//GEN-LINE:MVDInitEnd
    
    /**
     * This method should return an instance of the display.
     */
    public Display getDisplay() {//GEN-FIRST:MVDGetDisplay
        return Display.getDisplay(this);
    }//GEN-LAST:MVDGetDisplay
    
    /**
     * This method should exit the midlet.
     */
    public void exitMIDlet() {//GEN-FIRST:MVDExitMidlet
        getDisplay().setCurrent(null);
        destroyApp(true);
        notifyDestroyed();
    }//GEN-LAST:MVDExitMidlet
    
    public void startApp() {
        
        MIDPCanvas C = new MIDPCanvas();
        C.M=this;
        getDisplay().setCurrent(C);
 
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
        
    }

 
    
}


Файл FontClass.java:

Код

import java.io.InputStream;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import java.io.IOException;

public class FontClass {
    private byte buff[] = new byte[768];//данные  таблицы символов из файла xxxxx.dat
    private static Image fontImage = null;
    private static int[] buf;//данные одного символа
    private int width = 0;
    private int Color = 0;
    int h_char;//высота символов
    int italic =0;//флаг стиля символов italic

    /** конструктор  FontClass */
    public FontClass()
    { }

    //Возвращает значение цвета из составляющих a-фльфа, RGB
    private int toBGR(int a, int r, int g, int b){
        return (b|(g<<8)|(r<<16)|(a<<24));
    }

    //Устанавливает текущий цвет отображения букв по составляющим  a-aфльфа, RGB
    public void setColor(int a, int r, int g, int b){
        Color=toBGR(a,r,g,b);
    }


//*******************   Выводит на экран один символ   *************************
public int drawChar(Graphics g, char c, int left, int top) {
        int result=0;
        if (fontImage != null) {
          String s=String.valueOf(c);
/*  unicode to ansi  */
          int ch = s.charAt(0) ;
                    ch = ch == 0x400 ? 0xa7 : ch == 0x450 ? 0xb7 : ch;
                    ch = ch > 0x400 ? ch - 0x350 : ch;

            int ind = ((int)(ch)-0x20)*3;//смещение данных в таблице xxxxx.dat

            int len=0;//смещение в таблице xxxxx.png

            int hlen = (buff[ind+1] & 0x00ff)<<8;//старший байт

            len=(buff[ind] & 0x00ff)+hlen;  //смещение в таблице xxxxx.png

            int width_char= buff[ind+2]+italic;//ширина символа


            fontImage.getRGB(buf, 0, width_char, len-2, 0,width_char, h_char);//считать в буфер

                   for(int i=0;i<buf.length;i++)
                   {
                        int color = (buf[i] &0x00ffffff);//читаем только RGB
                        if (color == 0) color =  Color;//если черный красим в цвет
                        buf[i] = color;
                    }

              g.drawRGB(buf, 0, width_char, left, top, width_char, h_char, true);
              if (c==' '){width_char=h_char>>2;}//если пробел
                result=width_char;
         }
        return result;
    }


//*****   Выводит строку символов  **********************************************
    public void drawString(Graphics g, String s, int left, int top) {
        int len = left;
        int w = 0;
        int max_width =g.getClipWidth();
        for (int i = 0; i < s.length(); i++) {
//          if s.charAt(i) == " "
            w=drawChar(g, s.charAt(i), len, top);
            len=len+w;
//            if (len >= max_width-1) return;
        }
        width=len;
    }

//**************   Инициализация, создание объектов и буферов   ****************
    public void Init(String name_font){

        try {//-----  загрузка image символов  ---------------
            fontImage = Image.createImage("/"+name_font+".png");

        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
//*************   загрузка таблицы расположения символов  *********************
        InputStream is = getClass().getResourceAsStream("/"+name_font+".dat");
         //System.out.println("f2s8.dat загружено");
        int off = 0;
        int readBytes = 0;
       int n_buf;
        try
        {
          while ( (readBytes = is.read(buff, off, buff.length)) > -1) {}//копируем в буфер
          h_char=buff[0];//высота символов

          if  (buff[1] ==1) {italic=h_char/4;}//если fontstyle = [italic] увеличиваем ширину символа
        }
        catch (Exception e)
        {
          System.out.println("Exception: " + e.toString());
        }

   n_buf =h_char*h_char;// кол-во байт 1 знакоместо
//System.out.println(n_buf);
       buf = new int[n_buf];

    }

    //Удаление объектов
    public void Destroy(){
        buff = null;
        buf = null;
        fontImage = null;
    }





}


Файл MIDPCanvas.java:

Код

import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;


public class MIDPCanvas extends Canvas implements CommandListener {
    private Command ExitCommand;
    public MIDlet M;
    public Displayable D;



    /**
     * constructor
     */
    public MIDPCanvas() {
        try {
            setFullScreenMode(true);
            // Set up this canvas to listen to command events
            setCommandListener(this);
            // Add the Exit command
            ExitCommand=new Command("Exit", Command.EXIT, 0);
            addCommand(ExitCommand);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * paint
     */
    public void paint(Graphics g) {
        g.setColor(200,200,200);
        g.fillRect(0,0,g.getClipWidth(),g.getClipHeight());

        FontClass MFont=new FontClass();
        MFont.Init("TimesNewRoman10");
        MFont.setColor(255,0,0,0);
        MFont.drawString(g,"ПРОБА прозрачных шрифтов на MIDL 2.0",0,20);
        MFont.drawString(g,"ПРОБА прозрачных шрифтов на MIDL 2.0",0,100);
         MFont.setColor(120,255,255,255);
         MFont.drawString(g,"ПРОБА прозрачных шрифтов на MIDL 2.0",1,21);
         MFont.drawString(g,"ПРОБА прозрачных шрифтов на MIDL 2.0",1,101);
        MFont.setColor(255,255,255,255);
        MFont.drawString(g,"Выход:",g.getClipWidth()-60,g.getClipHeight()-20);
        System.gc();
      //  MFont.Destroy();
        MFont.Init("ArialBlack36");
MFont.setColor(255,0,0,250);
MFont.drawString(g,"MobiLab",0,25);
MFont.setColor(100,100,100,100);
MFont.drawString(g,"MobiLab",3,28);
MFont.setColor(50,0,0,255);


        MFont.setColor(100,100,100,100);
        MFont.drawString(g,"MagDelphi",5,65);
        MFont.setColor(30,100,100,100);
        MFont.drawString(g,"MagDelphi",8,68);
 //       MFont.setColor(50,0,0,255);

//MFont.drawString(g,"Выход121:-)",g.getClipWidth()-100,g.getClipHeight()-40);
MFont.Destroy();

    }

    /**
     * Called when a key is pressed.
     */
    protected  void keyPressed(int keyCode) {
    }

    /**
     * Called when a key is released.
     */
    protected  void keyReleased(int keyCode) {
    }

    /**
     * Called when a key is repeated (held down).
     */
    protected  void keyRepeated(int keyCode) {
    }

    /**
     * Called when the pointer is dragged.
     */
    protected  void pointerDragged(int x, int y) {
    }

    /**
     * Called when the pointer is pressed.
     */
    protected  void pointerPressed(int x, int y) {
    }

    /**
     * Called when the pointer is released.
     */
    protected  void pointerReleased(int x, int y) {
    }

    /**
     * Called when action should be handled
     */
    public void commandAction(Command command, Displayable displayable) {
        if(command==ExitCommand){
            Display.getDisplay(M).setCurrent(null);
            M.notifyDestroyed();
        }

    }

}


Исходник взят с сайта: http://www.mobilab.ru/articles/100/
PM MAIL   Вверх
eugine_s
Дата 3.8.2009, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

Репутация: 17
Всего: 17



Цитата(MegaBitz @  2.8.2009,  16:58 Найти цитируемый пост)
ava.lang.ArrayIndexOutOfBoundsException
at FontClass.drawChar(FontClass.java:52)


Класс FontClass, метод drawChar - где-то обращаешься к массиву и индекс, по которому обращаешься, больше, чем размер массива.

Это сообщение отредактировал(а) eugine_s - 3.8.2009, 13:18
PM MAIL   Вверх
Bchgroup
Дата 7.8.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 7.7.2009

Репутация: нет
Всего: нет



Я бы даже сказал в строке 52 файла FontClass.java  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.1639 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.