1

我正在尝试使用 J2ME 构建一个简单的基于菜单的 GUI。菜单项当前是从类 Button 派生的类的对象。有什么办法可以:

  1. 替换按钮中的文本并显示图像,有点像图标?

  2. 使文本和图像并排显示在同一菜单栏上。

如果我的问题不清楚,请告诉我,我会编辑它。

4

1 回答 1

6

您可以通过扩展类来创建自己的Item看起来像按钮的按钮。CustomItem

这是一个具有良好MyButton类的工作 MIDlet:

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();
    }
}
于 2010-07-14T12:47:57.887 回答