j2me程序创建GRID菜单?

时间:2012-03-31 20:03:38

标签: java-me

我想在网格视图中创建一个操作列表。例如,访问此URL。

http://cdn-static.cnet.co.uk/i/product_media/40000186/nokia1616_01.jpg

2 个答案:

答案 0 :(得分:0)

您可以查看此question或此page(并使用 LWUIT CustomItems )或扩展“canvas”< /strong>。这样,你需要为网格视图中的每个操作提供两张图片。一个用于正常状态,另一个用于高亮显示。这是一个简单的画布,代表2 * 2网格中的4个操作:

public class GridCanvas extends Canvas {

    int highlightedRow = 0;
    int highlightedColumn = 0;
    Image[][] normalImageMat;
    Image[][] highlightedImageMat;
    Image[][] imageMat;
    int gridColumnNo;
    int gridRowNo;

    /**
     * constructor
     */
    public GridCanvas() {
        gridColumnNo = 2;
        gridRowNo = 2;

        normalImageMat = new Image[gridRowNo][gridColumnNo];
        highlightedImageMat = new Image[gridRowNo][gridColumnNo];
        imageMat = new Image[gridRowNo][gridColumnNo];

        try {

            for (int i = 0; i < gridRowNo; i++) {
                for (int j = 0; j < gridColumnNo; j++) {
                    normalImageMat[i][j] = Image.createImage("/hello/normalImage" + i + j + ".png");
                }
            }

            for (int i = 0; i < gridRowNo; i++) {
                for (int j = 0; j < gridColumnNo; j++) {
                    highlightedImageMat[i][j] = Image.createImage("/hello/highlightedImage" + i + j + ".png");
                }
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * paint
     */
    public void paint(Graphics g) {
        g.setColor(255, 255, 255);
        g.fillRect(0, 0, getWidth(), getHeight());

        for (int i = 0; i < gridRowNo; i++) {
            System.arraycopy(normalImageMat[i], 0, imageMat[i], 0, 2);
        }
        imageMat[highlightedRow][highlightedColumn] = highlightedImageMat[highlightedRow][highlightedColumn];


        int width = 0;
        int height = 0;
        for (int i = 0; i < gridRowNo; i++) {
            for (int j = 0; j < gridColumnNo; j++) {
                g.drawImage(imageMat[i][j], width, height, 0);
                width = width + imageMat[i][j].getWidth();
            }
            width = 0;
            height = height + imageMat[0][0].getHeight();
        }

    }

    /**
     * Called when a key is pressed.
     */
    protected void keyPressed(int keyCode) {
        int gameAction = this.getGameAction(keyCode);
        if (gameAction == RIGHT) {
            highlightedColumn = Math.min(highlightedColumn + 1, gridColumnNo - 1);
        } else if (gameAction == LEFT) {
            highlightedColumn = Math.max(highlightedColumn - 1, 0);
        } else if (gameAction == UP) {
            highlightedRow = Math.max(0, highlightedRow - 1);
        } else if (gameAction == DOWN) {
            highlightedRow = Math.min(gridRowNo - 1, highlightedRow + 1);
        }
        repaint();
    }
}   

在实际样本中,由于屏幕和图标尺寸,您将检测gridColumnNo和gridRowNo。

答案 1 :(得分:0)

如果您不能使用LWUIT(许可证,库大小等)并且不想将屏幕渲染保留为LCDUI(CustomItem),则应扩展Canvas。

我在http://smallandadaptive.blogspot.com.br/2010/12/touch-menu.html有自适应网格的共享代码。随意使用它。
在此示例中,所有项目都是字符串,但您可以更改TouchItem以绘制图像。