I am trying to build a simple menu-based GUI with J2ME. The menu entries are currently objects of classes derived from the class Button. Is there any way I can:
You can create your own Item
that looks like a button by extending the CustomItem class.
This is a working MIDlet with a good MyButton
class:
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.CustomItem;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.ItemStateListener;
import javax.microedition.midlet.MIDlet;
public class TestMidlet extends MIDlet implements ItemStateListener {
class MyButton extends CustomItem {
private Image _image = null;
private boolean _down = false;
private int _clicks = 0;
public MyButton(Image image) {
super("");
_image = image;
}
// Button's image
public void setImage(Image image) {
_image = image;
repaint();
}
public Image getImage() {
return _image;
}
// Has the button been clicked?
public boolean isClicked() {
if(_clicks>0) {
_clicks -= 1;
return true;
}
return false;
}
// Is the button currently down?
public boolean isDown() {
return _down;
}
public void setDown(boolean down) {
if(_down)
_clicks += 1;
if(down!=_down) {
_down = down;
repaint();
notifyStateChanged();
}
}
public void setDown() {
setDown(true);
}
public void setUp() {
setDown(false);
}
// Minimal button size = image size
protected int getMinContentHeight() {
return getImage().getHeight();
}
protected int getMinContentWidth() {
return getImage().getWidth();
}
// Preferred button size = image size + borders
protected int getPrefContentHeight(int width) {
return getImage().getHeight()+2;
}
protected int getPrefContentWidth(int height) {
return getImage().getWidth()+2;
}
// Button painting procedure
protected void paint(Graphics g, int w, int h) {
// Fill the button with grey color - background
g.setColor(192, 192, 192);
g.fillRect(0, 0, w, h);
// Draw the image in the center of the button
g.drawImage(getImage(), w/2, h/2, Graphics.HCENTER|Graphics.VCENTER);
// Draw the borders
g.setColor(isDown()?0x000000:0xffffff);
g.drawLine(0, 0, w, 0);
g.drawLine(0, 0, 0, h);
g.setColor(isDown()?0xffffff:0x000000);
g.drawLine(0, h-1, w, h-1);
g.drawLine(w-1, 0, w-1, h);
}
// If FIRE key is pressed, the button becomes pressed (down state)
protected void keyPressed(int c) {
if(getGameAction(c)==Canvas.FIRE)
setDown();
}
// When FIRE key is released, the button becomes released (up state)
protected void keyReleased(int c) {
if(getGameAction(c)==Canvas.FIRE)
setUp();
}
// The same for touchscreens
protected void pointerPressed(int x, int y) {
setDown();
}
protected void pointerReleased(int x, int y) {
setUp();
}
}
MyButton button = null;
public void itemStateChanged(Item item) {
if(item==button) {
if(button.isClicked())
System.out.print("clicked, ");
System.out.println(button.isDown()?"currently down":"currently up");
}
}
public void startApp() {
try {
Form form = new Form("Example");
button = new MyButton(Image.createImage("/icon.png"));
form.append(button);
form.setItemStateListener(this);
Display.getDisplay(this).setCurrent(form);
} catch(Exception e) {
e.printStackTrace();
}
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
notifyDestroyed();
}
}