使用NetBeans进行J2ME开发(三):低级图形用户界面Canvas

J2ME移动游戏引擎架构解析:从标准MIDP到高性能游戏开发 在移动嵌入式开发领域,Java ME(J2ME)作为早期跨平台解决方案,通过MIDP规范为移动应用提供了基础运行环境。其核心原理是在资源受限设备上实现Java应用的标准化部署,技术价值在于平衡了开发效率与硬件多样性。然而,面对图形渲染、音效处理等高性能需求,标准API往往显得力不从心。为此,行业引入了专门的移动游戏引擎,通过在J2ME架构之上构建原生高性能桥梁,直接优化图形渲染与音效支持等关键模块。这类引擎通常遵循开放与优化双重设计原则,既保持与JCP标准的兼容性,又通过本地化实现和硬件抽象层提升执行效率。 阅读详情
在这一篇中,我将向大家介绍图形用户界面中的低级图形用户界面。所谓低级图形用户界面,指的是那种我们可以自己在上面画图的控件,它是和TextBox, List等等这些用户控件刚好相对的概念,因为这些用户控件的形状是事先画好的,无需我们程序员操心,所以称为高级图形界面。低级图形用户界面什么东西都 需要我们自己画,所以比较复杂,当然也更加灵活,只有想不到,没有画不出,所以我们先介绍它。

  在J2ME开发中,低级图形用户界面是 由javax.microedition.lcdui.Canvas类实现的,我们只要继承这个类,并实现这个类的paint方法,就可以随心所欲的进行 绘画了。当然,绘画之前,我们少不了要了解我们的手机屏幕究竟有多大的画图空间,这可以通过调用Canvas类的getWidth和getHeight方 法实现。下面是一个简短的程序,向大家演示了怎么获画布的大小,同时,也算是一个小小的框架。首先,当然是创建我们自己的画布,代码如下:
package com.xkland.j2me;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;

/**
 *
 * 
@author 海边沫沫
 
*/

public class MyCanvas extends Canvas {
    
    
/** Creates a new instance of MyCanvas */
    
public MyCanvas() {
    }

    
    
public void clearBackground(Graphics g){
        
int color = g.getColor();
        g.setColor(
0xffffff);
        g.fillRect(
0,0,getWidth(),getHeight());
        g.setColor(color);
    }

    
    
public void paint(Graphics g){
        
//清除背景
        clearBackground(g);
        
        
//显示可供绘图的区域的大小
        g.drawString("宽度:",10,10,Graphics.LEFT|Graphics.TOP);
        g.drawString(String.valueOf(getWidth()),
50,10,Graphics.LEFT|Graphics.TOP);
        g.drawString(
"高度:",10,25,Graphics.LEFT|Graphics.TOP);
        g.drawString(String.valueOf(getHeight()),
50,25,Graphics.LEFT|Graphics.TOP);
    }

    
}

  第二个类当然就是我们的Midlet了,因为它是主程序嘛。在程序启动的时候调用display.setCurrent将画布设置为主界面,同时设置事件监听器。代码比较简单,如下:
package com.xkland.j2me;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

/**
 *
 * 
@author  海边沫沫
 * 
@version
 
*/

public class CanvasTest extends MIDlet{
    
private Canvas canvas = new MyCanvas();
    
private Display display = null;
    
private Command exitCommand = new Command("退出",Command.EXIT,1);
    
    
public void startApp() {
        
if(display==null){
            display 
= Display.getDisplay(this);
            canvas.addCommand(exitCommand);
            canvas.setCommandListener(
new MyCommandListener(this,canvas));
            display.setCurrent(canvas);
        }

    }

    
    
public void pauseApp() {
    }

    
    
public void destroyApp(boolean unconditional) {
    }

}

  第三个类当然是我们的事件监听器类了,等一下我们会讲到,Canvas支持许多低级事件,比如键盘的按键事件,所以我们这里把事件监听器单独抽取出来,代码如下:
package com.xkland.j2me;

import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Canvas;

/**
 *
 * 
@author 海边沫沫
 
*/

public class MyCommandListener implements CommandListener{
    
    
private CanvasTest app;
    
private Canvas canvas;
    
    
/** Creates a new instance of MyCommandListener */
    
public MyCommandListener(CanvasTest app,Canvas canvas) {
        
this.app = app;
        
this.canvas = canvas;
    }

    
    
public void commandAction(Command cmd, Displayable displayable){
        
if(cmd.getLabel().equalsIgnoreCase("退出")){
            app.destroyApp(
false);
            app.notifyDestroyed();
        }

    }

    
}

  下面是运行效果:
25.PNG


   知道了画图区域的大小,同时又知道Canvas可以支持许多低级事件,我们就可以发挥我们自己的想象力创建一个小游戏了。下面,我将写一个简单的拼图游 戏,只需要使用上下左右四个方向键操作即可,在事件监听器中,我们只需响应Canvas的keyPressed()事件即可。代码也不复杂,只需把上面的 程序稍加扩展即可。当然,我们还需要准备一些图片当素材。

  首先,在网上随便找一张图片,使用图形编辑软件调整图片的大小,然后再裁成 3*4共12幅图象。把这12幅图象分别命名为1.png到12.png,同时还要准备一张全白的图片,命名为0.png,这张图片和前面的12张图片一 样大小。在项目所在的文件夹下建立一个文件夹,取名为pictures,把这些图片都拷贝进去。在NetBeans IDE左边的文件选项卡中可以看到这些文件,如图:
26.PNG


  但是,在生成项目的时候,这些文件并不会自动打包到项目中,我们必须将这个文件夹捆绑为该项目的资源。在项目上点右键,在弹出的菜单中选择属性,弹出如下对话框,选中左边的“库和资源”,在右边点击“添加文件夹”按钮即可:

27.PNG

  下面是我的MyCanvas类的全部代码,其它两个类的代码没有改变。在这里,我使用的图片是174*280的大小,切割后的小图片每一个都是58*70的大小,空白的图片也是58*70的大小。请看代码:
package com.xkland.j2me;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import java.util.Random;

/**
 *
 * 
@author 海边沫沫
 
*/

public class MyCanvas extends Canvas {
    
public int[][] pics = new int[4][4];
    
public Image[] images = new Image[13];
    
public int step = 0;
    
public int spaceX = 3;
    
public int spaceY = 0;
    
public int spaceValue = 0;
    
    
/** Creates a new instance of MyCanvas */
    
public MyCanvas() {
        
//随机填充数组
        for(int i=0;i<4;i++){
            
for(int j=0;j<3;j++){
                pics[i][j] 
= i*3 + j + 1;
            }

        }
       
        pics[
0][3] = 0;
        
        Random rand 
= new Random();
        
for(int i=0; i<4; i++){
            
int x1 = rand.nextInt(3);
            
int y1 = rand.nextInt(4);
            
int x2 = rand.nextInt(3);
            
int y2 = rand.nextInt(4);
            
int n = pics[y1][x1];
            pics[y1][x1] 
= pics[y2][x2];
            pics[y2][x2] 
= n;
        }

        
        
//载入图片
        for(int i=0; i<13; i++){
            
try{
                images[i] 
= Image.createImage("/" + String.valueOf(i) + ".png");
            }
catch(Exception e){
                
//不做处理
            }

        }

    }

    
    
public void clearBackground(Graphics g){
        
int color = g.getColor();
        g.setColor(
0xcccccc);
        g.fillRect(
0,0,getWidth(),getHeight());
        g.setColor(color);
    }

    
    
public void paint(Graphics g){
        
//清除背景
        clearBackground(g);
        
        
//绘制网格
        g.setColor(0x000000);
        g.drawRect(
1,3,236,284);
        g.drawLine(
1,74,237,74);
        g.drawLine(
1,145,178,145);
        g.drawLine(
1,216,178,216);
        g.drawLine(
60,3,60,287);
        g.drawLine(
119,3,119,287);
        g.drawLine(
178,3,178,287);
        
        
//根据pics数组和images数组的内容绘图到网格中
        for(int i=0; i<4; i++){
            
for(int j=0; j<3; j++){
                g.drawImage(images[pics[i][j]],j
*59+2,i*71+4,Graphics.TOP|Graphics.LEFT);
            }

        }

        g.drawImage(images[pics[
0][3]],179,4,Graphics.TOP|Graphics.LEFT);
        
        
//绘制所用的步骤
        g.drawString("步数:",182,140,Graphics.TOP|Graphics.LEFT);
        g.setColor(
0xffffff);
        g.fillRect(
182,158,50,18);
        g.setColor(
0xff0000);
        g.drawString(String.valueOf(step),
187,160,Graphics.TOP|Graphics.LEFT);

    }

    
       
    
public void keyPressed(int keyCode){
        
switch(getGameAction(keyCode)){
            
case RIGHT:
                right();
                
break;
            
case LEFT:
                left();
                
break;
            
case UP:
                up();
                
break;
            
case DOWN:
                down();
                
break;
        }

       repaint();
    }

    
    
public void up(){
        
if(spaceY < 3){
            pics[spaceY][spaceX] 
= pics[spaceY+1][spaceX];
            pics[spaceY
+1][spaceX] = 0;
            spaceY 
++;
            step 
++;
        }

    }

    
    
public void down(){
        
if(spaceY >0){
            pics[spaceY][spaceX] 
= pics[spaceY-1][spaceX];
            pics[spaceY
-1][spaceX] = 0;
            spaceY 
--;
            step 
++;
        }

        
    }

    
    
public void left(){
        
int rightLimit = 2;
        
if(spaceY == 0){
            rightLimit 
= 3;
        }

        
if(spaceX < rightLimit){
            pics[spaceY][spaceX] 
= pics[spaceY][spaceX+1];
            pics[spaceY][spaceX
+1] = 0;
            spaceX 
++;
            step 
++;
        }

        
    }

    
    
public void right(){
        
if(spaceX > 0 ){
            pics[spaceY][spaceX] 
= pics[spaceY][spaceX -1];
            pics[spaceY][spaceX
-1] = 0;
            spaceX 
--;
            step 
++;
        }

        
    }
    
}


  运行项目,得到如下的效果,使用上下左右四个键可以移动图片:

29.PNG

  游戏过程中的截图:

30.PNG

  游戏完成后的截图:

28.PNG

  当然,大家也可以自己添加拼图完成后的判断代码,在拼图成功后自动弹出提示信息。 
JavaPaint:用Java代码制作的绘画程序 JavaPaint 用Java代码制作的Paint程序设计者:Ha Yong Shin创建时间:2018/05/21 与Netbeans一起使用,可编译Sketcher并运行。 立即下载

相关推荐

javax.microedition.jar

文件结构 javax/microedition/io/ javax/microedition/lcdui/ javax/microedition/midlet/ javax/microedition/rms/

详解使用NetBeans IDE 8.2进行可视化图形界面设计——高仿QQ登录界面

NetBeans IDE可视化图形界面设计简单介绍、QQ登录界面的设计

人生处处是围城,一切都是最好的安排! 7518

双闭环PWM整流器VOC控制 +SVPWM调制仿真(Simulink仿真实现)

内容概要:本文详细介绍了基于Simulink平台构建的双闭环PWM整流器VOC(虚拟磁链定向控制)与SVPWM(空间矢量脉宽调制)相结合的仿真模型,系统阐述了三相电压型PWM整流器在电压定向控制策略下的建模方法与控制实现。通过设计外环直流电压控制与内环电流控制的双闭环结构,实现了对整流器的高功率因数运行、能量双向流动及动态性能优化的精确调控。结合SVPWM调制技术,有效提升了直流侧电压利用率并显著降低输出电流谐波含量,增强了系统的整体效率与稳定性。该仿真模型适用于新能源发电、电动汽车充电系统、微电网等高性能电能变换应用场景,文档还配套提供了丰富的学习资源与技术支持渠道,便于深入研究与工程实践。; 适合人群:面向电气工程、自动化、电力电子及相关专业的高校学生、科研人员以及从事新能源、智能电网、电力传动等领域研发工作的工程师;尤其适合已具备自动控制理论、电力电子变换技术和MATLAB/Simulink仿真基础的专业人士进一步深化学习与应用。; 使用场景及目标:①深入理解PWM整流器的工作机理及其双闭环控制系统的架构设计;②掌握VOC控制与SVPWM调制的协同工作机制,提升系统动静态响应性能;③支撑科研课题、课程设计、毕业设计或实际工程项目中的整流器控制系统开发与验证;④作为高级电能变换技术的学习范例,促进对现代电力电子系统控制策略的综合理解与创新能力培养。; 阅读建议:建议结合文中提供的百度网盘链接与公众号资源,下载完整的Simulink仿真模型进行实操演练,在MATLAB环境中调整控制器参数并观察仿真结果,深入剖析控制逻辑与系统响应特性;同时可参考同系列资源如PI双闭环控制、电网不平衡工况下的控制策略等案例,开展对比分析与拓展研究,全面提升系统建模与控制设计的综合能力。

气象预警 降雨分布图层 克里金插值 java实现 tiff制作 geoserver发布

【代码】气象预警 降雨分布图层 克里金插值 java实现 tiff制作 geoserver发布。

weixin_43871535的博客 2211

TSMC 40nm LP工艺下,新手画版图最容易踩的5个坑(附Cadence避坑指南)

本文详细解析了TSMC 40nm LP工艺下版图设计的5个常见陷阱,包括MOS管尺寸转换、DNW隔离、Guard Ring设计、金属布线和DRC检查。通过Cadence实战技巧和设计规则优化,帮助新手工程师规避典型错误,提升版图设计效率和质量。

weixin_26800111的博客 456

WhatsApp注册流程逆向分析:从协议解析到风控对抗实战

移动应用安全分析的核心在于理解客户端与服务端的交互协议与验证机制。通过逆向工程,可以深入剖析应用的数据加密、传输与身份验证原理,这对于构建安全模型、进行自动化测试和风控策略研究具有重要技术价值。在即时通讯、金融支付等高安全要求场景中,掌握应用注册流程的底层实现是评估其安全性的关键。本文聚焦于使用动态分析工具如Frida进行Hook和流量抓包,结合设备指纹识别与模拟器检测技术,详细解析了大型应用的注册风控体系,为安全研究人员和开发者提供了从环境搭建到实战对抗的完整方法。

weixin_33935636的博客 315

java jpanel 画图_如何在jPanel中绘图? (swing/graphics Java)

我正在一个项目,我正在尝试做一个油漆计划。到目前为止,我使用netbeans创建一个GUI和设置程序。到现在为止,我可以调用所有协调的必要的内部绘制,但我很困惑,如何实际内部绘画。在我的代码结束我有一个失败的尝试在面板内绘图。任何人都可以解释/显示如何使用图形在这样的例子?所有的例子我发现做一个类,扩展它与JPanel,但我不知道如果我可以这样做,因为它是在netbeans生成。我需要在我的JFr...

weixin_35291771的博客 1251

人形机器人系列——硬件介绍

人形机器人是多领域交叉技术的产物,主要由三大系统组成:感知系统、决策系统和执行系统。感知系统感知系统是人形机器人获取外界信息的途径,主要由各种传感器组成。其中,视觉传感器用于获取图像信息,如摄像头、激光雷达等;触觉传感器用于感知触碰和压力,如力/力矩传感器、声学传感器等。这些传感器收集到的信息为机器人的决策和执行提供基础。决策系统决策系统是人形机器人的大脑,负责处理和决策各种信息。它由芯片和算法组成。芯片是硬件基础,提供计算能力;算法是软件基础,用于处理和分析传感器收集到的信息,并做出相应的决策。执行系统。

liangwqi的博客 1万+

NetBeans 创建画图程序

在netBeans中并没有直接提供画图的JPanel,我们需要自定义一个类来重写paintComponent方法。     我们需要自定义一个类继承JPanel,并重写paintComponent方法 /* * To change this template, choose Tools | Templates * and open the template in the editor.

huaye2007的专栏 2567

如何使用Dify 搭建一个用自然语言查询数据库的 Agent?

这样就会发布完毕。

AI Agent 首席体验官 1698

Odoo17商城微信支付模块,快速一个实现可在线支付的商城

通过集成微信支付APIv3,Odoo 系统实现了高效、安全的支付流程。Native扫码支付和Jsapi微信浏览器内直接拉起支付为用户提供了更加便捷的支付方式。同时,通过发送下单及支付消息给管理员,商家可以实时了解订单状态并进行相应处理。通过集成微信支付 结合 Odoo 系统内置的商城模块,可以为商家快速实现功能完善、高效的电商解决方案。

AaronZZH 的博客 2268

关于j2me触屏

<br /><br />首先要说,要使得你开发的j2me程序响应来自触屏的动作,不需要任何插件。<br /><br /><br />高级UI组件本身是支持触屏的,所以不用任何特殊的处理。<br />低级UI组件(Canvas类)如果要响应触屏,就得实现Canvas类中的几个方法:<br />pointerPressed,pointerDragged,pointerReleased。方法的具体使用,可参阅文档,不在此赘述。<br /> <br />另外,代码都写好了后,怎么看效果呢?为什么在模拟器的屏幕上点击

彭香香的专栏 1310

华为OD新系统机试真题 - 失灵的键盘(C/C++/Py/Java/Js/Go)

华为OD新系统机试真题 【失灵的键盘】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD4月15号机试真题【失灵的键盘】

qq_45776114的博客 1064

如何使用J2ME中的线程

线程在J2ME开发中是不可或缺的一部分,J2ME继承了J2SE中关于java.lang中的Runnable接口,以及Thread类。但是,由于J2ME应用的特殊性,J2ME程序中去除了部分API,没有线程组的概念,也没有daemon线程。今天,我们从一个例子出发,来学习J2ME当中的线程的概念。我们选取的例子是俄罗斯方块。首先,有一些要注意的事项:1.注意一点,要注意在J2me中不要使用浮点数,这

Scent of Mobile Application 1910

小程序跳转链接实战:https://wxaurl.cn/、weixin://dl/business/ 跳转与明文 URL Scheme 生成指南

本文聚焦小程序跳转链接开发核心技术,深入解析 https://wxaurl.cn/*TICKET* 与 weixin://dl/business/?t= *TICKET* 两种链接的生成方法。详细阐述生成前的准备工作、服务端接口调用步骤及注意事项,同时剖析 iOS 与 Android 系统在链接适配方面的差异。此外,针对明文 URL Scheme 获取,从平台设置、拼接规则、使用限制等方面展开讲解,并结合实际应用案例提出优化建议,帮助开发者快速掌握小程序跳转链接生成与明文URL Scheme获取的关键技术。

邓邓子的博客 2万+

Apollo Planning决策规划算法代码详细解析 (2):Scenario执行

上一章节讲Scenario的决策逻辑,当确认当前Scenario后,本章节继续深入讲解在代码中,Scenario的执行过程。Scenario的Process()函数根据配置文件顺序执行stage,并判断目前处于哪个stage。当确认好stage后调用该stage对应的Process()函数,来进行具体的规划任务。 码字不易,喜欢的朋友们麻烦点个关注与赞。 在本文你将学到下面这些内容: Scenario的Process()函数的作用于调用方式; Scenario对象的初始化方法; 如何给每个Scen

自动驾驶Player的博客 5608

(一)NetBeans IDE上的Java手机游戏例子

准备软件:1。下载Java SE 5.0或以上版本(http://java.sun.com/javase/downloads/index_jdk5.jsp )2。下载NetBeans IDE 5.5.1 (http://zh-cn.netbeans.org/ )3。下载NetBeans Mobility Pack for CLDC (http://zh-cn.netbeans.org/ ) 安装软件:按照以下顺序安装软件: 安装Java SE 5.0 安装NetBe

软件开发资料汇总 376

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

深入理解MIDP的界面类体系

深入理解MIDP的界面类体系作者:陈跃峰Email:cqucyf@gmail.com        因为在MIDP手机编程中,没有控制台的概念,所以所有的MIDP手机软件都必须有自己的界面,下面就熟悉一下MIDP的界面类体系。       首先说明的是,MIDP的标准界面类都位于javax.microedition.lcdui包中,使用时一定要记得引入。       在界面体系中,所以可以直接显示

爪哇米工作室陈跃峰的移动开发博客 4102

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

javax.microedition.lcdui(1)

按语:此处的翻译只为自己存档。借优快云当网络办公环境。感谢谷歌翻译、金山词霸 。欢迎口水板砖。感谢指正 翻译中......java.lang.Object javax.microedition.lcdui.Displaypublic class Displayex

单纯的生活 2060

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

在Canvas中实现字母输入

在游戏开发中为了记录的用户积分,就需要用户输入自己的名字,这时就需要我们自己实现字母的输入。下面的代码演示了实现这个要求的方法。/* * MainCanvas.java * * Created on 2006年8月7日, 下午1:45 * */import javax.microedition.lcdui.Canvas;import javax.microedition.lcdui.Gra

mydeman的学习日志 1894

java 第六次课--图形用户界面概述

Java图形用户界面概述一、Java语言平台无关性组件的实现图形用户界面是当今流行的操作系统界面。Java语言为了适应发展趋势,也具有开发图形化的用户界面的功能。Java语言自身的特点要求其图形用户界面具有平台无关性。早期的Java版本JDK1.0和JDK1.1采用 的是AWT组件。特点是简单、易于理解。AWT组件中采用了一种称为对等体(peer)的机制,每个组件都有一个对应的对等体,是用

flyuniverse_shell的专栏 4808
上一篇: 使用NetBeans进行J2ME开发(二):把程序转移到手机上
下一篇: 使用NetBeans进行J2ME开发(四):高级图形用户界面
SunnyJavaMoon
博客等级 码龄21年 20粉丝 36原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值