Проблема вообщем такая не могу считать шрифт с картинки, код компилируется отлично но при запуске появляется ошибка: java.lang.ArrayIndexOutOfBoundsException at FontClass.drawChar(FontClass.java:52) at FontClass.drawString(FontClass.java:83) at MIDPCanvas.paint(MIDPCanvas.java:44) Вот исходник: Файл MyFont.java: Code: 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: Code: 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: Code: 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/