Изображение в кнопке - j2me

Я пытаюсь создать простой графический интерфейс на основе меню с J2ME. Элементы меню в настоящее время являются объектами классов, производных от класса Button. Могу ли я как-нибудь:

  1. Замените текст в кнопке и вместо этого покажите изображение, что-то вроде значка?

  2. Сделайте так, чтобы текст и изображение отображались рядом в одной строке меню.

Если мой вопрос не ясен, дайте мне знать, и я отредактирую его.


person Sriram    schedule 10.07.2010    source источник


Ответы (1)


Вы можете создать свой собственный Item, который выглядит как кнопка, расширив CustomItemкласс.

Это рабочий мидлет с хорошим классом MyButton:

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();
    }
}
person Oleh Prypin    schedule 14.07.2010
comment
привет БлЭкспирит! Спасибо за ответ. Я посмотрел CustomItem. Если подумать, вот некоторая дополнительная информация: у меня уже есть класс VoiceButton, который расширяет Button и реализует некоторые дополнительные функции. Итак, что я хочу сделать, так это иметь какой-то класс-контейнер, который может иметь объект VoiceButton, а также связанное с ним изображение. Поможет ли CustomItem? - person Sriram; 15.07.2010
comment
Я бы вообще не рекомендовал расширять класс Button. Я отредактирую свой ответ и добавлю несколько примеров. - person Oleh Prypin; 15.07.2010
comment
Если вам нужен текст И изображение в одной кнопке, пишите сюда, постараюсь сделать. Но лучше сделайте это сами! - person Oleh Prypin; 15.07.2010
comment
Я постараюсь использовать этот код и подогнать к большему количеству того, что мне нужно (если это еще не сделано). Благодарность! - person Sriram; 15.07.2010
comment
Привет, БлаЭкспирит! Спасибо за ответ. Мне удалось добавить текстовую функциональность к кнопке. Большое спасибо! Ответ принят! - person Sriram; 19.07.2010