Java/J2ME/2D
Содержание
Box Text Canvas
<source lang="java">
import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Font; import javax.microedition.lcdui.Graphics; public class BoxTextCanvas extends Canvas {
private Font mFont; public BoxTextCanvas() { mFont = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_LARGE); } public void paint(Graphics g) { int w = getWidth(); int h = getHeight(); g.setColor(0xffffff); g.fillRect(0, 0, w, h); g.setColor(0x000000); String s = "dolce"; int stringWidth = mFont.stringWidth(s); int stringHeight = mFont.getHeight(); int x = (w - stringWidth) / 2; int y = h / 2; g.setFont(mFont); g.drawString(s, x, y, Graphics.TOP | Graphics.LEFT); g.drawRect(x, y, stringWidth, stringHeight); }
}
</source>
Illustrate Graphics MIDlet
<source lang="java">
/* J2ME in a Nutshell By Kim Topley ISBN: 0-596-00253-X
- /
import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.rumand; import javax.microedition.lcdui.rumandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Font; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.List; import javax.microedition.midlet.MIDlet; public class GraphicsMIDlet extends MIDlet implements CommandListener {
// The MIDlet"s Display object private Display display; // Flag indicating first call of startApp protected boolean started; // Exit command private Command exitCommand; // Back to examples list command private Command backCommand; // The example selection list private List examplesList; // The Canvases used to demonstrate different Items private Canvas[] canvases; // The example names. Used to populate the list. private String[] examples = { "Lines", "Rectangles", "RectangleFills", "Arcs", "FilledArcs", "Text" }; protected void startApp() { if (!started) { started = true; display = Display.getDisplay(this); // Create the common commands createCommands(); // Create the canvases createCanvases(); // Create the list of examples createList(); // Start with the List display.setCurrent(examplesList); } } protected void pauseApp() { } protected void destroyApp(boolean unconditional) { } public void commandAction(Command c, Displayable d) { if (d == examplesList) { // New example selected int index = examplesList.getSelectedIndex(); display.setCurrent(canvases[index]); } else if (c == exitCommand) { // Exit. No need to call destroyApp // because it is empty. notifyDestroyed(); } else if (c == backCommand) { // Go back to main selection list display.setCurrent(examplesList); } } private void createCommands() { exitCommand = new Command("Exit", Command.EXIT, 0); backCommand = new Command("Back", Command.BACK, 1); } private void createList() { examplesList = new List("Select Example", List.IMPLICIT); for (int i = 0; i < examples.length; i++) { examplesList.append(examples[i], null); } examplesList.setCommandListener(this); } private void createCanvases() { canvases = new Canvas[examples.length]; canvases[0] = createLinesCanvas(); canvases[1] = createRectanglesCanvas(); canvases[2] = createRectangleFillsCanvas(); canvases[3] = createArcsCanvas(); canvases[4] = createFilledArcsCanvas(); canvases[5] = createTextCanvas(); } private void addCommands(Displayable d) { d.addCommand(exitCommand); d.addCommand(backCommand); d.setCommandListener(this); } // Create the Canvas for the line drawing example private Canvas createLinesCanvas() { Canvas canvas = new LineCanvas(); addCommands(canvas); return canvas; } // Create the Canvas for the rectangles example private Canvas createRectanglesCanvas() { Canvas canvas = new RectanglesCanvas(); addCommands(canvas); return canvas; } // Create the Canvas for the filled rectangles example private Canvas createRectangleFillsCanvas() { Canvas canvas = new RectangleFillsCanvas(); addCommands(canvas); return canvas; } // Create the Canvas for the arcs example private Canvas createArcsCanvas() { Canvas canvas = new ArcsCanvas(); addCommands(canvas); return canvas; } // Create the Canvas for the filled arcs example private Canvas createFilledArcsCanvas() { Canvas canvas = new FilledArcsCanvas(); addCommands(canvas); return canvas; } // Create the Canvas for the text example private Canvas createTextCanvas() { Canvas canvas = new TextCanvas(); addCommands(canvas); return canvas; }
} // A canvas that illustrates line drawing class LineCanvas extends Canvas {
public void paint(Graphics g) { int width = getWidth(); int height = getHeight(); // Fill the background using black g.setColor(0); g.fillRect(0, 0, width, height); // White horizontal line g.setColor(0xFFFFFF); g.drawLine(0, height/2, width - 1, height/2); // Yellow dotted horizontal line g.setStrokeStyle(Graphics.DOTTED); g.setColor(0xFFFF00); g.drawLine(0, height/4, width - 1, height/4); // Solid diagonal line in brightest gray g.setGrayScale(255); g.setStrokeStyle(Graphics.SOLID); g.drawLine(0, 0, width - 1, height - 1); }
} // A canvas that illustrates rectangles class RectanglesCanvas extends Canvas {
public void paint(Graphics g) { int width = getWidth(); int height = getHeight(); // Create a white background g.setColor(0xffffff); g.fillRect(0, 0, width, height); // Draw a solid rectangle g.setColor(0); g.drawRect(width/4, 0, width/2, height/4); // Draw a dotted rectangle inside // the solid rectangle. g.setStrokeStyle(Graphics.DOTTED); g.drawRect(width/4 + 4, 4, width/2 - 8, height/4 - 8); // Draw a rounded rectangle g.setStrokeStyle(Graphics.SOLID); g.drawRoundRect(width/4, height/2, width/2, height/4, 16, 8); }
} // A canvas that illustrates filled rectangles class RectangleFillsCanvas extends Canvas {
public void paint(Graphics g) { int width = getWidth(); int height = getHeight(); // Create a black background g.setColor(0); g.fillRect(0, 0, width, height); // Draw a filled rectangle with // a dotted rectangle around it g.setStrokeStyle(Graphics.DOTTED); g.setColor(0x00ff00); g.fillRect(width/4, height/4, width/2, height/2); g.setColor(0xffff00); g.drawRect(width/4, height/4, width/2, height/2); }
} // A canvas that illustrates arcs class ArcsCanvas extends Canvas {
public void paint(Graphics g) { int width = getWidth(); int height = getHeight(); // Create a black background g.setColor(0); g.fillRect(0, 0, width, height); // A quarter circle, clockwise 90 degrees // from the 3 o"clock position. Show the // bounding rectangle as well. g.setColor(0xffffff); g.drawArc(0, 0, width/2, height/2, 0, 90); g.setStrokeStyle(Graphics.DOTTED); g.setColor(0xffff00); g.drawRect(0, 0, width/2, height/2); // A quarter circle, anticlockwise 90 degrees // from the 3 o"clock position. g.setStrokeStyle(Graphics.SOLID); g.setColor(0xffffff); g.drawArc(width/2, 0, width/2, height/2, 0, -90); g.setStrokeStyle(Graphics.DOTTED); g.setColor(0xffff00); g.drawRect(width/2, 0, width/2, height/2); // An elliptical arc from the six o"clock // position, counterclockwise 180 degrees g.setStrokeStyle(Graphics.SOLID); g.setColor(0xffffff); g.drawArc(0, height/2, width, height/2, -90, -180); g.setStrokeStyle(Graphics.DOTTED); g.setColor(0xffff00); g.drawRect(0, height/2, width, height/2); }
} // A canvas that illustrates filled arcs class FilledArcsCanvas extends Canvas {
public void paint(Graphics g) { int width = getWidth(); int height = getHeight(); // Create a black background g.setColor(0); g.fillRect(0, 0, width, height); // A quarter circle, clockwise 90 degrees // from the 3 o"clock position. Show the // bounding rectangle as well. g.setColor(0xffffff); g.fillArc(0, 0, width/2, height/2, 0, 90); g.setStrokeStyle(Graphics.DOTTED); g.setColor(0xffff00); g.drawRect(0, 0, width/2, height/2); // A quarter circle, anticlockwise 90 degrees // from the 3 o"clock position. g.setStrokeStyle(Graphics.SOLID); g.setColor(0xffffff); g.fillArc(width/2, 0, width/2, height/2, 0, -90); g.setStrokeStyle(Graphics.DOTTED); g.setColor(0xffff00); g.drawRect(width/2, 0, width/2, height/2); // An elliptical arc from the six o"clock // position, counterclockwise 180 degrees g.setStrokeStyle(Graphics.SOLID); g.setColor(0xffffff); g.fillArc(0, height/2, width, height/2, -90, -180); g.setStrokeStyle(Graphics.DOTTED); g.setColor(0xffff00); g.drawRect(0, height/2, width, height/2); }
} // A canvas that illustrates text rendering class TextCanvas extends Canvas {
public void paint(Graphics g) { int width = getWidth(); int height = getHeight(); // Create a black background g.setColor(0); g.fillRect(0, 0, width, height); // Top-left of canvas g.setColor(0xffffff); g.drawString("Top left", 0, 0, Graphics.TOP | Graphics.LEFT); // Draw another string one line below Font font = g.getFont(); g.drawString("Below top left", 0, font.getHeight(), Graphics.TOP | Graphics.LEFT); // Bottom-right of canvas g.drawString("Bottom right", width, height, Graphics.BOTTOM | Graphics.RIGHT); // Mixed fonts and colors String str = "Multi-font "; font = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_UNDERLINED, Font.SIZE_LARGE); g.setFont(font); g.drawString(str, 0, height/2, Graphics.LEFT | Graphics.BASELINE); int x = font.stringWidth(str); g.setColor(0x00ff00); g.setFont(Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD | Font.STYLE_ITALIC, Font.SIZE_MEDIUM)); g.drawString("and multi-color", x, height/2, Graphics.LEFT | Graphics.BASELINE); }
}
</source>
Key Canvas
<source lang="java">
import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Font; import javax.microedition.lcdui.Graphics; public class KeyCanvas extends Canvas {
private Font mFont; private String mMessage = "[Press keys]"; public KeyCanvas() { mFont = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_MEDIUM); } public void paint(Graphics g) { int w = getWidth(); int h = getHeight(); // Clear the Canvas. g.setGrayScale(255); g.fillRect(0, 0, w - 1, h - 1); g.setGrayScale(0); g.drawRect(0, 0, w - 1, h - 1); g.setFont(mFont); int x = w / 2; int y = h / 2; g.drawString(mMessage, x, y, Graphics.BASELINE | Graphics.HCENTER); } protected void keyPressed(int keyCode) { int gameAction = getGameAction(keyCode); switch (gameAction) { case UP: mMessage = "UP"; break; case DOWN: mMessage = "DOWN"; break; case LEFT: mMessage = "LEFT"; break; case RIGHT: mMessage = "RIGHT"; break; case FIRE: mMessage = "FIRE"; break; case GAME_A: mMessage = "GAME_A"; break; case GAME_B: mMessage = "GAME_B"; break; case GAME_C: mMessage = "GAME_C"; break; case GAME_D: mMessage = "GAME_D"; break; default: mMessage = ""; break; } repaint(); }
}
</source>
Offscreen MIDlet
<source lang="java">
import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.rumand; import javax.microedition.lcdui.rumandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; import javax.microedition.midlet.MIDlet; public class OffscreenMIDlet extends MIDlet {
public void startApp() { Displayable d = new OffscreenCanvas(); d.addCommand(new Command("Exit", Command.EXIT, 0)); d.setCommandListener(new CommandListener() { public void commandAction(Command c, Displayable s) { notifyDestroyed(); } }); Display.getDisplay(this).setCurrent(d); } public void pauseApp() { } public void destroyApp(boolean unconditional) { }
} class OffscreenCanvas extends Canvas {
private Image mImage; public void paint(Graphics g) { if (mImage == null) initialize(); g.drawImage(mImage, 0, 0, Graphics.TOP | Graphics.LEFT); } private void initialize() { int w = getWidth(); int h = getHeight(); mImage = Image.createImage(w, h); Graphics g = mImage.getGraphics(); g.drawRect(0, 0, w - 1, h - 1); g.drawLine(0, 0, w - 1, h - 1); g.drawLine(w - 1, 0, 0, h - 1); }
}
</source>
Pacer
<source lang="java">
import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class Pacer extends MIDlet{
public void startApp() { Displayable d = new PacerCanvas(); d.addCommand(new Command("Exit", Command.EXIT, 0)); d.setCommandListener(new CommandListener() { public void commandAction(Command c, Displayable s) { notifyDestroyed(); } } ); Display.getDisplay(this).setCurrent(d); } public void pauseApp() { } public void destroyApp(boolean unconditional) { }
} class PacerCanvas extends Canvas {
public void paint(Graphics g) { int w = getWidth(); int h = getHeight(); g.setColor(0xffffff); g.fillRect(0, 0, w, h); g.setColor(0x000000); for (int x = 0; x < w; x += 10) g.drawLine(0, w - x, x, 0); int z = 50; g.drawRect(z, z, 20, 20); z += 20; g.fillRoundRect(z, z, 20, 20, 5, 5); z += 20; g.drawArc(z, z, 20, 20, 0, 360); }
}
</source>
Pointer Example
<source lang="java">
/* J2ME: The Complete Reference James Keogh Publisher: McGraw-Hill ISBN 0072227109
- /
//jad file (please verify the jar size) /* MIDlet-Name: PointerExample MIDlet-Version: 1.0 MIDlet-Vendor: MyCompany MIDlet-Jar-URL: PointerExample.jar MIDlet-1: PointerExample, , PointerExample MicroEdition-Configuration: CLDC-1.0 MicroEdition-Profile: MIDP-1.0 MIDlet-JAR-SIZE: 100
- /
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class PointerExample extends MIDlet {
private Display display; private MyClass canvas; public PointerExample() { display = Display.getDisplay(this); canvas = new MyClass (this); } protected void startApp() { display.setCurrent( canvas ); } protected void pauseApp() { } protected void destroyApp( boolean unconditional ) { } public void exitMIDlet() { destroyApp(true); notifyDestroyed(); }
} class MyClass extends Canvas implements CommandListener {
private Command exit; private Command erase; private boolean eraseFlag = false; private boolean isFirstPaint; private int sX = 0,sY = 0, cX = 0, cY = 0; private PointerExample pointerExample; public MyClass (PointerExample pointerExample) { this.pointerExample = pointerExample; exit = new Command("Exit", Command.EXIT, 1); erase = new Command("Erase", Command.SCREEN, 1); addCommand(exit); addCommand(erase); setCommandListener(this); isFirstPaint = true; } protected void paint(Graphics graphics) { if (eraseFlag || isFirstPaint) { graphics.setColor(255, 255, 255); graphics.fillRect(0, 0, getWidth(), getHeight()); eraseFlag = isFirstPaint = false; sX = 0; sY = 0; cX = 0; cY = 0; return; } graphics.setColor(0, 0, 0); graphics.drawLine(sX, sY, cX, cY); sX = cX; sY = cY; } public void commandAction(Command command, Displayable displayable) { if (command == exit) pointerExample.exitMIDlet(); else if (command == erase) { eraseFlag = true; repaint(); } } protected void pointerPressed(int x, int y) { sX = x; sY = y; } protected void pointerDragged(int x, int y) { cX = x; cY = y; repaint(); }
}
</source>
Quatsch MIDlet
<source lang="java">
/* Wireless Java 2nd edition Jonathan Knudsen Publisher: Apress ISBN: 1590590775
- /
import java.io.IOException; import javax.microedition.lcdui.*; import javax.microedition.lcdui.game.*; import javax.microedition.midlet.MIDlet; public class QuatschMIDlet extends MIDlet
implements CommandListener { private Display mDisplay; private QuatschCanvas mQuatschCanvas; private Form mShowForm; private Command mExitCommand, mShowCommand, mOkCommand; public void startApp() { if (mQuatschCanvas == null) { try { mQuatschCanvas = new QuatschCanvas("/quatsch.png", "/atmosphere.png", "/background_tiles.png"); mQuatschCanvas.start(); mExitCommand = new Command("Exit", Command.EXIT, 0); mShowCommand = new Command("Show/Hide", Command.SCREEN, 0); mOkCommand = new Command("OK", Command.OK, 0); mQuatschCanvas.addCommand(mExitCommand); mQuatschCanvas.addCommand(mShowCommand); mQuatschCanvas.setCommandListener(this); } catch (IOException ioe) { System.out.println(ioe); } } mDisplay = Display.getDisplay(this); mDisplay.setCurrent(mQuatschCanvas); } public void pauseApp() {} public void destroyApp(boolean unconditional) { mQuatschCanvas.stop(); } public void commandAction(Command c, Displayable s) { if (c.getCommandType() == Command.EXIT) { destroyApp(true); notifyDestroyed(); } else if (c == mShowCommand) { if (mShowForm == null) { mShowForm = new Form("Show/Hide"); ChoiceGroup cg = new ChoiceGroup("Layers", Choice.MULTIPLE); cg.append("Fog", null); cg.append("Dr. Quatsch", null); cg.append("Background", null); mShowForm.append(cg); mShowForm.addCommand(mOkCommand); mShowForm.setCommandListener(this); } ChoiceGroup cg = (ChoiceGroup)mShowForm.get(0); cg.setSelectedIndex(0, mQuatschCanvas.isVisible(0)); cg.setSelectedIndex(1, mQuatschCanvas.isVisible(1)); cg.setSelectedIndex(2, mQuatschCanvas.isVisible(2)); mDisplay.setCurrent(mShowForm); } else if (c == mOkCommand) { ChoiceGroup cg = (ChoiceGroup)mShowForm.get(0); mQuatschCanvas.setVisible(0, cg.isSelected(0)); mQuatschCanvas.setVisible(1, cg.isSelected(1)); mQuatschCanvas.setVisible(2, cg.isSelected(2)); mDisplay.setCurrent(mQuatschCanvas); } }
} class QuatschCanvas extends GameCanvas implements Runnable {
private boolean mTrucking; private LayerManager mLayerManager; private TiledLayer mAtmosphere; private TiledLayer mBackground; private int mAnimatedIndex; private Sprite mQuatsch; private int mState, mDirection; private static final int kStanding = 1; private static final int kRunning = 2; private static final int kLeft = 1; private static final int kRight = 2; private static final int[] kRunningSequence = { 0, 1, 2 }; private static final int[] kStandingSequence = { 3 }; public QuatschCanvas(String quatschImageName, String atmosphereImageName, String backgroundImageName) throws IOException { super(true); // Create a LayerManager. mLayerManager = new LayerManager(); int w = getWidth(); int h = getHeight(); mLayerManager.setViewWindow(96, 0, w, h); createBackground(backgroundImageName); createAtmosphere(atmosphereImageName); createQuatsch(quatschImageName); } private void createBackground(String backgroundImageName) throws IOException { // Create the tiled layer. Image backgroundImage = Image.createImage(backgroundImageName); int[] map = { 1, 2, 0, 0, 0, 0, 0, 0, 3, 3, 2, 0, 0, 0, 5, 0, 3, 3, 3, 2, 4, 1, 3, 2, 6, 6, 6, 6, 6, 6, 6, 6 }; mBackground = new TiledLayer(8, 4, backgroundImage, 48, 48); mBackground.setPosition(12, 0); for (int i = 0; i < map.length; i++) { int column = i % 8; int row = (i - column) / 8; mBackground.setCell(column, row, map[i]); } mAnimatedIndex = mBackground.createAnimatedTile(8); mBackground.setCell(3, 0, mAnimatedIndex); mBackground.setCell(5, 0, mAnimatedIndex); mLayerManager.append(mBackground); } private void createAtmosphere(String atmosphereImageName) throws IOException { // Create the atmosphere layer Image atmosphereImage = Image.createImage(atmosphereImageName); mAtmosphere = new TiledLayer(8, 1, atmosphereImage, atmosphereImage.getWidth(), atmosphereImage.getHeight()); mAtmosphere.fillCells(0, 0, 8, 1, 1); mAtmosphere.setPosition(0, 96); mLayerManager.insert(mAtmosphere, 0); } private void createQuatsch(String quatschImageName) throws IOException { // Create the sprite. Image quatschImage = Image.createImage(quatschImageName); mQuatsch = new Sprite(quatschImage, 48, 48); mQuatsch.setPosition(96 + (getWidth() - 48) / 2, 96); mQuatsch.defineReferencePixel(24, 24); setDirection(kLeft); setState(kStanding); mLayerManager.insert(mQuatsch, 1); } public void start() { mTrucking = true; Thread t = new Thread(this); t.start(); } public void run() { int w = getWidth(); int h = getHeight(); Graphics g = getGraphics(); int frameCount = 0; int factor = 2; int animatedDelta = 0; while (mTrucking) { if (isShown()) { int keyStates = getKeyStates(); if ((keyStates & LEFT_PRESSED) != 0) { setDirection(kLeft); setState(kRunning); mBackground.move(3, 0); mAtmosphere.move(3, 0); mQuatsch.nextFrame(); } else if ((keyStates & RIGHT_PRESSED) != 0) { setDirection(kRight); setState(kRunning); mBackground.move(-3, 0); mAtmosphere.move(-3, 0); mQuatsch.nextFrame(); } else { setState(kStanding); } frameCount++; if (frameCount % factor == 0) { int delta = 1; if (frameCount / factor < 10) delta = -1; mAtmosphere.move(delta, 0); if (frameCount / factor == 20) frameCount = 0; mBackground.setAnimatedTile(mAnimatedIndex, 8 + animatedDelta++); if (animatedDelta == 3) animatedDelta = 0; } g.setColor(0x5b1793); g.fillRect(0, 0, w, h); mLayerManager.paint(g, 0, 0); flushGraphics(); } try { Thread.sleep(80); } catch (InterruptedException ie) {} } } public void stop() { mTrucking = false; } public void setVisible(int layerIndex, boolean show) { Layer layer = mLayerManager.getLayerAt(layerIndex); layer.setVisible(show); } public boolean isVisible(int layerIndex) { Layer layer = mLayerManager.getLayerAt(layerIndex); return layer.isVisible(); } private void setDirection(int newDirection) { if (newDirection == mDirection) return; if (mDirection == kLeft) mQuatsch.setTransform(Sprite.TRANS_MIRROR); else if (mDirection == kRight) mQuatsch.setTransform(Sprite.TRANS_NONE); mDirection = newDirection; } private void setState(int newState) { if (newState == mState) return; switch (newState) { case kStanding: mQuatsch.setFrameSequence(kStandingSequence); mQuatsch.setFrame(0); break; case kRunning: mQuatsch.setFrameSequence(kRunningSequence); break; default: break; } mState = newState; }
}
</source>
Show various anchor points
<source lang="java">
/*--------------------------------------------------
- Text.java
- Show various anchor points
- Example from the book: Core J2ME Technology
- Copyright John W. Muchow http://www.CoreJ2ME.ru
- You may use/modify for any non-commercial purpose
- -------------------------------------------------*/
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class Text extends MIDlet {
private Display display; // The display private TextCanvas canvas; // Canvas to display text private AnchorPtList anchorPt; // List to query for anchor point private int anchorPoint = Graphics.BASELINE | Graphics.HCENTER; public Text() { display = Display.getDisplay(this); canvas = new TextCanvas(this); anchorPt = new AnchorPtList("Anchor point", List.IMPLICIT, this); } protected void startApp() { showCanvas(); } protected void pauseApp() { } protected void destroyApp( boolean unconditional ) { } public void showCanvas() { display.setCurrent(canvas); } public void showList() { display.setCurrent(anchorPt); } public int getAnchorPoint() { return anchorPoint; } public void setAnchorPoint(int anchorPoint) { this.anchorPoint = anchorPoint; } public void exitMIDlet() { destroyApp(true); notifyDestroyed(); }
} /*--------------------------------------------------
- Class TextCanvas
- Draw text at specified anchor point
- -------------------------------------------------*/
class TextCanvas extends Canvas implements CommandListener {
private Command cmExit; // Exit midlet private Command cmGetAnchorPt; private Text midlet; public TextCanvas(Text midlet) { this.midlet = midlet; // Create commands & listen for events cmExit = new Command("Exit", Command.EXIT, 1); cmGetAnchorPt = new Command("Anchor", Command.SCREEN, 2); addCommand(cmExit); addCommand(cmGetAnchorPt); setCommandListener(this); } /*-------------------------------------------------- * Draw text *-------------------------------------------------*/ protected void paint(Graphics g) { int xcenter = getWidth() / 2, ycenter = getHeight() / 2;
// Due to a bug in MIDP 1.0.3 we need to // force a clear of the display g.setColor(255, 255, 255); // White pen g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(0, 0, 0); // Black pen // Choose a font g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM)); // Draw a dot at the center of the display g.drawLine(xcenter, ycenter, xcenter, ycenter); // x and y are always at the center of the display // Move the text around x and y based on the anchor point g.drawString("go j2me!", xcenter, ycenter, midlet.getAnchorPoint()); } /*-------------------------------------------------- * Exit midlet or show anchor point selection list *-------------------------------------------------*/ public void commandAction(Command c, Displayable d) { if (c == cmExit) midlet.exitMIDlet(); else if (c == cmGetAnchorPt) { midlet.showList(); } }
} /*--------------------------------------------------
- Class AnchorPtList
- List to query for an anchor point
- -------------------------------------------------*/
class AnchorPtList extends List implements CommandListener {
private Text midlet; public AnchorPtList(String title, int listType, Text midlet) { // Call list constructor super(title, listType); this.midlet = midlet; append("Top/Left", null); append("Top/HCenter", null); append("Top/Right", null); append("Baseline/Left", null); append("Baseline/HCenter", null); append("Baseline/Right", null); append("Bottom/Left", null); append("Bottom/HCenter", null); append("Bottom/Right", null); setCommandListener(this); } /*-------------------------------------------------- * Commands to set anchor point *-------------------------------------------------*/ public void commandAction(Command c, Displayable s) { switch (getSelectedIndex()) { case 0: midlet.setAnchorPoint(Graphics.TOP | Graphics.LEFT); break; case 1: midlet.setAnchorPoint(Graphics.TOP | Graphics.HCENTER); break; case 2: midlet.setAnchorPoint(Graphics.TOP | Graphics.RIGHT); break; case 3: midlet.setAnchorPoint(Graphics.BASELINE | Graphics.LEFT); break; case 4: midlet.setAnchorPoint(Graphics.BASELINE | Graphics.HCENTER); break; case 5: midlet.setAnchorPoint(Graphics.BASELINE | Graphics.RIGHT); break; case 6: midlet.setAnchorPoint(Graphics.BOTTOM | Graphics.LEFT); break; case 7: midlet.setAnchorPoint(Graphics.BOTTOM | Graphics.HCENTER); break; case 8: midlet.setAnchorPoint(Graphics.BOTTOM | Graphics.RIGHT); break; default: midlet.setAnchorPoint(Graphics.BASELINE | Graphics.HCENTER); } midlet.showCanvas(); }
}
</source>
Simple Canvas
<source lang="java">
/* Title: J2ME Games With MIDP2 Authors: Carol Hamer Publisher: Apress ISBN: 1590593820
- /
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; /**
* This is the main class of the hello world demo. * * @author Carol Hamer */
public class Hello extends MIDlet implements CommandListener {
/** * The canvas is the region of the screen that has been allotted * to the game. */ HelloCanvas myCanvas; /** * The Command objects appear as buttons in this example. */ private Command exitCommand = new Command("Exit", Command.EXIT, 99); /** * The Command objects appear as buttons in this example. */ private Command toggleCommand = new Command("Toggle Msg", Command.SCREEN, 1); /** * Initialize the canvas and the commands. */ public Hello() { myCanvas = new HelloCanvas(); myCanvas.addCommand(exitCommand); myCanvas.addCommand(toggleCommand); // we set one command listener to listen to all // of the commands on the canvas: myCanvas.setCommandListener(this); } //---------------------------------------------------------------- // implementation of MIDlet /** * Start the application. */ public void startApp() throws MIDletStateChangeException { // display my canvas on the screen: Display.getDisplay(this).setCurrent(myCanvas); myCanvas.repaint(); } /** * If the MIDlet was using resources, it should release * them in this method. */ public void destroyApp(boolean unconditional) throws MIDletStateChangeException { } /** * This method is called to notify the MIDlet to enter a paused * state. The MIDlet should use this opportunity to release * shared resources. */ public void pauseApp() { } //---------------------------------------------------------------- // implementation of CommandListener /* * Respond to a command issued on the Canvas. * (either reset or exit). */ public void commandAction(Command c, Displayable s) { if(c == toggleCommand) { myCanvas.toggleHello(); } else if(c == exitCommand) { try { destroyApp(false); notifyDestroyed(); } catch (MIDletStateChangeException ex) { } } }
}
/**
* This class represents the region of the screen that has been allotted * to the game. * * @author Carol Hamer */
class HelloCanvas extends Canvas {
//--------------------------------------------------------- // fields /** * whether or not the screen should currently display the * "hello world" message. */ boolean mySayHello = true; //----------------------------------------------------- // initialization and game state changes /** * toggle the hello message. */ void toggleHello() { mySayHello = !mySayHello; repaint(); } //------------------------------------------------------- // graphics methods /** * clear the screen and display the hello world message if appropriate. */ public void paint(Graphics g) { // get the dimensions of the screen: int width = getWidth(); int height = getHeight(); // clear the screen (paint it white): g.setColor(0xffffff); // The first two args give the coordinates of the top // left corner of the rectangle. (0,0) corresponds // to the top left corner of the screen. g.fillRect(0, 0, width, height); // display the hello world message if appropriate:. if(mySayHello) { Font font = g.getFont(); int fontHeight = font.getHeight(); int fontWidth = font.stringWidth("Hello World!"); // set the text color to red: g.setColor(255, 0, 0); g.setFont(font); // write the string in the center of the screen g.drawString("Hello World!", (width - fontWidth)/2, (height - fontHeight)/2, g.TOP|g.LEFT); } }
}
</source>
Text Example
<source lang="java">
//jad file (please verify the jar size) /* MIDlet-Name: TextExample MIDlet-Version: 1.0 MIDlet-Vendor: MyCompany MIDlet-Jar-URL: TextExample.jar MIDlet-1: TextExample, , TextExample MicroEdition-Configuration: CLDC-1.0 MicroEdition-Profile: MIDP-1.0 MIDlet-JAR-SIZE: 100
- /
import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.rumand; import javax.microedition.lcdui.rumandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Font; import javax.microedition.lcdui.Graphics; import javax.microedition.midlet.MIDlet; public class TextExampleMIDlet extends MIDlet {
private Display display; private MyCanvas canvas; public TextExampleMIDlet() { display = Display.getDisplay(this); canvas = new MyCanvas(this); } protected void startApp() { display.setCurrent(canvas); } protected void pauseApp() { } protected void destroyApp(boolean unconditional) { } public void exitMIDlet() { destroyApp(true); notifyDestroyed(); }
} class MyCanvas extends Canvas implements CommandListener {
private Command exit; private TextExampleMIDlet textExample; public MyCanvas(TextExampleMIDlet textExample) { this.textExample = textExample; exit = new Command("Exit", Command.EXIT, 1); addCommand(exit); setCommandListener(this); } protected void paint(Graphics graphics) { graphics.setColor(255, 255, 255); graphics.fillRect(0, 0, getWidth(), getHeight()); graphics.setColor(255, 0, 0); graphics.setFont(Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD, Font.SIZE_SMALL)); graphics.drawString("Profound statement.", 50, 10, Graphics.HCENTER | Graphics.BASELINE); } public void commandAction(Command command, Displayable displayable) { if (command == exit) { textExample.exitMIDlet(); } }
}
</source>
Text MIDlet
<source lang="java">
import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.rumand; import javax.microedition.lcdui.rumandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Graphics; import javax.microedition.midlet.MIDlet; public class TextMIDlet extends MIDlet {
public void startApp() { Displayable d = new TextCanvas(); d.addCommand(new Command("Exit", Command.EXIT, 0)); d.setCommandListener(new CommandListener() { public void commandAction(Command c, Displayable s) { notifyDestroyed(); } }); Display.getDisplay(this).setCurrent(d); } public void pauseApp() { } public void destroyApp(boolean unconditional) { }
} class TextCanvas extends Canvas {
public void paint(Graphics g) { int w = getWidth(); int h = getHeight(); g.setColor(0xffffff); g.fillRect(0, 0, w, h); g.setColor(0x000000); g.drawString("corner", 0, 0, Graphics.TOP | Graphics.LEFT); g.drawString("corner", w, 0, Graphics.TOP | Graphics.RIGHT); g.drawString("corner", 0, h, Graphics.BOTTOM | Graphics.LEFT); g.drawString("corner", w, h, Graphics.BOTTOM | Graphics.RIGHT); g.drawString("Sin Wagon", w / 2, h / 2, Graphics.BASELINE | Graphics.HCENTER); }
}
</source>
Translate Coordinates
<source lang="java">
/* J2ME: The Complete Reference James Keogh Publisher: McGraw-Hill ISBN 0072227109
- /
//jad file (please verify the jar size) /* MIDlet-Name: TranslateCoordinates MIDlet-Version: 1.0 MIDlet-Vendor: MyCompany MIDlet-Jar-URL: TranslateCoordinates.jar MIDlet-1: TranslateCoordinates, , TranslateCoordinates MicroEdition-Configuration: CLDC-1.0 MicroEdition-Profile: MIDP-1.0 MIDlet-JAR-SIZE: 100
- /
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class TranslateCoordinates extends MIDlet {
private Display display; private MyCanvas canvas; public TranslateCoordinates () { display = Display.getDisplay(this); canvas = new MyCanvas (this); } protected void startApp() { display.setCurrent( canvas ); } protected void pauseApp() { } protected void destroyApp( boolean unconditional ) { } public void exitMIDlet() { destroyApp(true); notifyDestroyed(); } class MyCanvas extends Canvas implements CommandListener { private Command exit; private TranslateCoordinates translateCoordinates; private Image image = null; public MyCanvas(TranslateCoordinates translateCoordinates) { this. translateCoordinates = translateCoordinates; exit = new Command("Exit", Command.EXIT, 1); addCommand(exit); setCommandListener(this); try { image = Image.createImage(70, 70); Graphics graphics = image.getGraphics(); graphics.setColor(255,0,0); graphics.fillArc(10, 10, 60, 50, 180, 180); } catch (Exception error) { Alert alert = new Alert("Failure", "Creating Image", null, null); alert.setTimeout(Alert.FOREVER); display.setCurrent(alert); } } protected void paint(Graphics graphics) { if (image != null) { graphics.setColor(255,255,255); graphics.fillRect(0, 0, getWidth(), getHeight()); graphics.translate(45, 45); graphics.drawImage(image, 0, 0, Graphics.VCENTER | Graphics.HCENTER); } } public void commandAction(Command command, Displayable display) { if (command == exit) { translateCoordinates.exitMIDlet(); } } }
}
</source>
Translate coordinate system
<source lang="java">
/*--------------------------------------------------
- Translate.java
- Translate coordinate system
- Example from the book: Core J2ME Technology
- Copyright John W. Muchow http://www.CoreJ2ME.ru
- You may use/modify for any non-commercial purpose
- -------------------------------------------------*/
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class Translate extends MIDlet {
private Display display; // The display private TranslateCanvas canvas; // Canvas public Translate() { display = Display.getDisplay(this); canvas = new TranslateCanvas(this); } protected void startApp() { display.setCurrent( canvas ); } protected void pauseApp() { } protected void destroyApp( boolean unconditional ) { } public void exitMIDlet() { destroyApp(true); notifyDestroyed(); }
} /*--------------------------------------------------
- Class Translate
- Draw image using translated coordinates
- -------------------------------------------------*/
class TranslateCanvas extends Canvas implements CommandListener {
private Command cmExit; // Exit midlet private Translate midlet; private Image im = null; private int translatex = 0, translatey = 0; public TranslateCanvas(Translate midlet) { this.midlet = midlet; // Create exit command & listen for events cmExit = new Command("Exit", Command.EXIT, 1); addCommand(cmExit); setCommandListener(this); try { // Create immutable image im = Image.createImage("/bolt.png"); } catch (java.io.IOException e) { System.err.println("Unable to locate or read .png file"); } } protected void paint(Graphics g) { if (im != null) { // Clear the background g.setColor(255, 255, 255); g.fillRect(0, 0, getWidth(), getHeight()); // Translate coordinates g.translate(translatex, translatey); // Always draw at 0,0 g.drawImage(im, 0, 0, Graphics.LEFT | Graphics.TOP); } } public void commandAction(Command c, Displayable d) { if (c == cmExit) midlet.exitMIDlet(); } protected void keyPressed(int keyCode) { switch (getGameAction(keyCode)) { case UP: // If scrolling off the top, roll around to bottom if (translatey - im.getHeight() < 0) translatey = getHeight() - im.getHeight(); else translatey -= im.getHeight(); break; case DOWN: // If scrolling off the bottom, roll around to top if ((translatey + im.getHeight() + im.getHeight()) > getHeight()) translatey = 0; else translatey += im.getHeight(); break; case LEFT: // If scrolling off the left, bring around to right if (translatex - im.getWidth() < 0) translatex = getWidth() - im.getWidth(); else translatex -= im.getWidth(); break; case RIGHT: // If scrolling off the right, bring around to left if ((translatex + im.getWidth() + translatex) > getWidth()) translatex = 0; else translatex += im.getWidth(); break; } repaint(); }
}
</source>
Use pointer events to draw onto the Canvas
<source lang="java">
/*--------------------------------------------------
- Doodle.java
- Use pointer events to draw onto the Canvas
- Example from the book: Core J2ME Technology
- Copyright John W. Muchow http://www.CoreJ2ME.ru
- You may use/modify for any non-commercial purpose
- -------------------------------------------------*/
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class Doodle extends MIDlet {
private Display display; // The display private DoodleCanvas canvas; // Canvas public Doodle() { display = Display.getDisplay(this); canvas = new DoodleCanvas(this); } protected void startApp() { display.setCurrent( canvas ); } protected void pauseApp() { } protected void destroyApp( boolean unconditional ) { } public void exitMIDlet() { destroyApp(true); notifyDestroyed(); }
} /*--------------------------------------------------
- Class DoodleCanvas
- Pointer event handling
- -------------------------------------------------*/
class DoodleCanvas extends Canvas implements CommandListener {
private Command cmExit; // Exit midlet private Command cmClear; // Clear display private int startx = 0, // Where pointer was clicked starty = 0, currentx = 0, // Current location currenty = 0; private Doodle midlet; private boolean clearDisplay = false; /*-------------------------------------------------- * Constructor *-------------------------------------------------*/ public DoodleCanvas(Doodle midlet) { this.midlet = midlet; // Create exit command & listen for events cmExit = new Command("Exit", Command.EXIT, 1); cmClear = new Command("Clear", Command.SCREEN, 1); addCommand(cmExit); addCommand(cmClear); setCommandListener(this); } /*-------------------------------------------------- * Paint the text representing the key code *-------------------------------------------------*/ protected void paint(Graphics g) { // Clear the background (to white) if (clearDisplay) { g.setColor(255, 255, 255); g.fillRect(0, 0, getWidth(), getHeight()); clearDisplay = false; startx = currentx = starty = currenty = 0; return; } // Draw with black pen g.setColor(0, 0, 0); // Draw line g.drawLine(startx, starty, currentx, currenty); // New starting point is the current position startx = currentx; starty = currenty; } /*-------------------------------------------------- * Command event handling *-------------------------------------------------*/ public void commandAction(Command c, Displayable d) { if (c == cmExit) midlet.exitMIDlet(); else if (c == cmClear) { clearDisplay = true; repaint(); } } /*-------------------------------------------------- * Pointer pressed *-------------------------------------------------*/ protected void pointerPressed(int x, int y) { startx = x; starty = y; } /*-------------------------------------------------- * Pointer moved *-------------------------------------------------*/ protected void pointerDragged(int x, int y) { currentx = x; currenty = y; repaint(); }
}
</source>