В моем MIDLet у меня есть экземпляр java-класса ImageFetcher с именем anImg. Также в моем MIDLet у меня есть команда, которая просто говорит fetch, CommandListener, который при нажатии выбирает fetch, запускает функцию ниже. Эта функция должна просто запустить public getImage () из экземпляра anImg класса ImageFetcher, который возвращает изображение и затем добавляет / устанавливает это изображение в форму на дисплее. (Вы можете узнать функцию getImage () из Nokia JavaME Wiki !!!)
Вместо любого отображаемого изображения это записывается на выходной терминал в NetBeans:
Сообщение: Java.lang.NullPointerException
ОДНАКО, если я заменил public getImage () на public static getImage () и заменил anImg.getImage () на ImageFetcher.getImage (), изображение успешно отобразится !!!
Спасибо за ваши ответы на этот вопрос :)
Я с нетерпением жду, когда вернусь после этого испытания!
FetchImageApp.java
...
...
public class FetchImageApp()
extends MIDlet implements CommandListener {
private ImageFetcher anImg; //this is my ImageFetcher instance, it is assigned within the constructor
public FetchImageApp(){
anImg = new ImageFetcher(); //NO IT WASN'T, I knew it was something simple... I feel a fool... but I know we all do it!
}
...
private doThis(){
try {
Image im;
if ((im = anImg.getImage()) != null) {
ImageItem ii = new ImageItem(null, im, ImageItem.LAYOUT_DEFAULT, null);
// If there is already an image, set (replace) it
if (form.size() != 0) {
form.set(0, ii);
} else // Append the image to the empty form
{
form.append(ii);
}
} else {
form.append("Unsuccessful download.");
}
// Display the form with the image
display.setCurrent(form);
} catch (Exception e) {
System.err.println("Msg: " + e.toString());
}
}
...
...
...
ImageFetcher.java
...
...
...
/*--------------------------------------------------
* Open connection and download png into a byte array.
*-------------------------------------------------*/
public Image getImage() throws IOException {
String url = "http://kenai.com/attachments/wiki_images/chessgame/java-duke-logo.png";
ContentConnection connection = (ContentConnection) Connector.open(url);
// * There is a bug in MIDP 1.0.3 in which read() sometimes returns
// an invalid length. To work around this, I have changed the
// stream to DataInputStream and called readFully() instead of read()
// InputStream iStrm = connection.openInputStream();
DataInputStream iStrm = connection.openDataInputStream();
ByteArrayOutputStream bStrm = null;
Image im = null;
try {
// ContentConnection includes a length method
byte imageData[];
int length = (int) connection.getLength();
if (length != -1) {
imageData = new byte[length];
// Read the png into an array
// iStrm.read(imageData);
iStrm.readFully(imageData);
} else // Length not available...
{
bStrm = new ByteArrayOutputStream();
int ch;
while ((ch = iStrm.read()) != -1) {
bStrm.write(ch);
}
imageData = bStrm.toByteArray();
bStrm.close();
}
// Create the image from the byte array
im = Image.createImage(imageData, 0, imageData.length);
} finally {
// Clean up
if (iStrm != null) {
iStrm.close();
}
if (connection != null) {
connection.close();
}
if (bStrm != null) {
bStrm.close();
}
}
return (im == null ? null : im);
}
...
...
...
Вот код слушателя согласно запросу:)
public void commandAction(Command c, Displayable d) {
if (c == doThisCommand) {
if (c.getLabel().equals("Start")) {
System.out.println("Started...");
begin();
//doThisCommand = new Command("Stop", Command.OK, 2); //ERROR:: After the command is changed to exit the program throws and unhandled excaption.
} else {
System.out.println("Stopped...");
doThisCommand = new Command("Start", Command.OK, 2);
}
} else if (c == exitCommand) {
notifyDestroyed();
} else {
throw new UnsupportedOperationException("Not supported yet.");
}
}