_MegaBit_
01.08.2009, 14:14
Проблема вообщем такая не могу считать шрифт с картинки, код компилируется отлично но при запуске появляется ошибка: 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/
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/