Java ME 日历不显示

2024-02-05

我一直在这里关注本教程:教程链接 http://www.developer.nokia.com/Community/Wiki/Building_a_Java_ME_Canvas_based_calendar/date_picker。但我似乎无法让应用程序正确显示。当我运行该应用程序时,我希望看到像教程中的 CalendarCanvas 这样的屏幕,但我得到了这个:

这是我的代码,我使用标准 MIDP 类。

创建日历类:

import java.util.Date;
import java.util.Calendar;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;


public class CreateCalendar
{
    /**
     * Array of strings which holds data for the month and day 
     * for the calendar application.
     */
    static final String[] month_labels = new String[]
    {
        "January", "Febuary", "March", "April", "May", "June", "July", "August", "Sepetember", "October", "November", "Decemeber"
    };
    static final String[] weekdays_labels = new String[]
    {
        "Mon", "Tue", "Wed", "Thur", "Fri", "Sat", "Sun"
    };

    public int startWeekday = 0;
    public int padding = 1;
    public int borderWidth = 4;
    public int borderColor = 0x009900;

    /**
     * Weekday Labels
     */
    public Font weekdayFont = Font.getDefaultFont();
    public int weekdayBackgroundColor = 0x009900;
    public int weekdayColor = 0xffffff;

    /**
     * Month/Year Labels
     */
    public Font headerFont = Font.getDefaultFont();
    public int headerBackgroundColor = 0x009900;
    public int headerColor = 0xffffff;

    /**
     * Cells Labels
     */
    public Font font = Font.getDefaultFont();
    public int foreColor = 0xffffff;
    public int backgroundColor = 0x009900;
    public int selectedBackgroundColor = 0xCCFF00;
    public int selectedForegroundColor = 0xffffff;

    /**
     * Size properties 
     */
    int width = 0;
    int height = 0;
    int headerHeight = 0;
    int weekHeight = 0;
    int cellWidth = 0;
    int cellHeight = 0;

    /**
     * Internal time properties
     */
    long currentTimeStamp = 0;
    Calendar calendar = null;
    int weeks = 0;

    public CreateCalendar(Date date)
    {
    calendar = Calendar.getInstance();
    setDate(date);
    initialize();
    }

    public Date getSelectedDate()
    {
        return calendar.getTime();
    }

    public void setDate(Date d)
    {
        currentTimeStamp = d.getTime();
        calendar.setTime(d);
        this.weeks = (int)Math.ceil(((double)getStartWeekday() + getMonthDays()) / 7);
    }

    public void setDate(long timestamp)
    {
        setDate(new Date(timestamp));
    }

    public void initialize()
    {
        this.cellWidth = font.stringWidth("MM") + 2 * padding;
        this.cellHeight = font.getHeight() + 2 * padding;
        this.headerHeight = headerFont.getHeight() + 2 * padding;
        this.weekHeight = weekdayFont.getHeight() + 2 * padding;
        this.width = 7 * (cellWidth + borderWidth) + borderWidth;
        initHeight();
    }

    void initHeight()
    {
        this.height = headerHeight + weekHeight + this.weeks * (cellHeight + borderWidth) + borderWidth;
    }

    int getMonthDays()
    {
        int month = calendar.get(Calendar.MONTH);
        switch (month)
        {
            case 3:
            case 5:
            case 8:
            case 10:
                return 30;    
            case 1:
                int year = calendar.get(Calendar.YEAR);
                return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) ? 29 : 28;
            default:
                return 31;
        }
    }

    int getStartWeekday()
    {
        Calendar c = Calendar.getInstance();
        c.set(Calendar.MONTH, calendar.get(Calendar.MONTH));
        c.set(Calendar.YEAR, calendar.get(Calendar.YEAR));
        c.set(Calendar.DAY_OF_MONTH, 1);
        return (c.get(Calendar.DAY_OF_WEEK) + 5) % 7;
    }

    public void KeyPressed(int key)
    {
        switch(key)
        {
            case Canvas.UP:
                go(-7);
                break;
            case Canvas.DOWN:
                go(7);
                break;
            case Canvas.RIGHT:
                go(1);
                break;
            case Canvas.LEFT:
                go(-1);
                break; 
        }
    }

    void go(int delta)
    {
        int prevMonth = calendar.get(Calendar.MONTH);
        setDate(currentTimeStamp + 864000000 * delta);
        if(calendar.get(Calendar.MONTH) != prevMonth)
        {
            initHeight();
        }
    }

    public void paint(Graphics g)
    {
        g.setColor(backgroundColor);
        g.fillRect(0, 0, width, height);
        g.setFont(headerFont);
        g.setColor(headerColor);
        g.drawString(month_labels[calendar.get(Calendar.MONTH)] + " " + calendar.get(Calendar.YEAR), width / 2, padding, Graphics.TOP | Graphics.HCENTER);
        g.translate(0, headerHeight);
        g.setColor(weekdayBackgroundColor);
        g.fillRect(0, 0, width, weekHeight);
        g.setColor(weekdayColor);
        g.setFont(weekdayFont);

        for(int i = 0; i < 7; i++)
        {
            g.drawString(weekdays_labels[(i + startWeekday) % 7], borderWidth + i * (cellWidth + borderWidth) + cellWidth / 2, padding, Graphics.TOP | Graphics.HCENTER);
        }

        g.translate(0, weekHeight);
        g.setColor(borderColor);

        for(int i = 0; i <= weeks; i++)
        {
            g.fillRect(0, i * (cellHeight + borderWidth), width, borderWidth);
        }
        for(int i = 0; i <=7; i++)
        {
            g.fillRect(i * (cellWidth + borderWidth), 0, borderWidth, height - headerHeight - weekHeight);
        }

        int days = getMonthDays();
        int dayIndex = (getStartWeekday() - this.startWeekday + 7) % 7;
        g.setColor(foreColor);
        int currentDay = calendar.get(Calendar.DAY_OF_MONTH);

        for(int i = 0; i < days; i++)
        {
            int weekday = (dayIndex + i) % 7;
            int row = (dayIndex + i) / 7;
            int x = borderWidth + weekday * (cellWidth + borderWidth) + cellWidth / 2;
            int y = borderWidth + row * (cellHeight + cellWidth) + padding;

            if(i + 1 == currentDay)
            {
                g.setColor(selectedBackgroundColor);
                g.fillRect(borderWidth + weekday * (cellWidth + borderWidth), borderWidth + row * (cellHeight + borderWidth), cellWidth, cellHeight);
                g.setColor(selectedForegroundColor);
            }

            g.drawString("" + (i + 1), x, y, Graphics.TOP | Graphics.HCENTER);

            if(i + 1 == currentDay)
            {
                g.setColor(foreColor);
            }
        }
        g.translate(0, - headerHeight - weekHeight);
    }

    private Date getTime() {
        throw new UnsupportedOperationException("Not yet implemented"); //TODO get current Time
    }

CalFrontEnd 类(扩展 MIDlet):

    public class CalFrontEnd extends MIDlet
{

  public CreateCalendar calendar;
  protected Display display;
  protected Form mainForm;

  public CalFrontEnd()
  {

  }

  public void startApp()
  {
       calendar = new CreateCalendar(new Date());
       calendar.headerFont = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD, Font.SIZE_LARGE);
       calendar.weekdayFont = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD, Font.SIZE_MEDIUM);
       calendar.weekdayBackgroundColor = 0xccccff;
       calendar.weekdayColor = 0x0000ff;
       calendar.headerColor = 0xffffff;
       calendar.initialize();


    display.getDisplay(this).setCurrent(
    new intCalendar(this));

  }

  public void pauseApp()
  {
  }

  public void destroyApp(boolean destroy)
  {
    notifyDestroyed();
  }
}} 

类中的代码CreateCalendar looks very有问题的。

In 先前的问题 https://stackoverflow.com/questions/10364705/java-me-help-displaying-calendar-canvas-from-nokia-tutorial你提到一些小的变量名称差异对教程中的代码进行了处理,但从代码片段中显示的内容来看,情况并非如此。

要找到重用教程代码的方法,最简单的方法如下所示。

  1. 复制教程中的源代码 - 文件 CalendarWidget.java 和 CalendarCanvas.java
    Copy as-is,仅在必要时调整包语句。

  2. Modify CalFrontEnd大约如下

    • 如果需要,添加 CalendarCanvas 的导入语句
    • 将 startApp 中的当前代码替换为最简单的 CalendarCanvas 调用,如下所示:
      
      
       public void startApp() {
           Display.getDisplay(this).setCurrent(
                   new CalendarCanvas(this));
       }  
  3. 测试代码、调整并修复它,直到您的 MIDlet 显示出您对 CalendarCanvas 的期望

  4. 完成上述操作后,继续修改代码以进一步满足您的需求。
    不要忘记测试您所做的更改,以确保事情确实按照您的预期进行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java ME 日历不显示 的相关文章

随机推荐

  • 如何在 webpack 中使用快捷路径“@”?

    我用我的 package json 执行了 npm run build 我收到了这条消息 如何在 webpack 中使用 错误于 node modules babel loader lib node modules vue loader l
  • 如何在实际的 Apple Watch(而不是模拟器中)上强制退出单个应用程序?

    开发应用程序时 有时强制退出应用程序很有用 而无需重新启动整个设备 在我的 iPhone 上 我可以通过双击主页按钮并将应用程序滑动到顶部来强制退出活动应用程序 对于实际的 Apple Watch 不是模拟器 强制退出应用程序特别有用 因为
  • Android - 位图缓存占用大量内存

    我对所有内存管理主题都是新手 所以有很多东西我不明白 我正在尝试在我的应用程序中缓存图像 但我遇到了内存消耗问题 所有位图 Chaching 代码几乎都是从这里复制粘贴的 http developer android com trainin
  • 通过管道id杀死linux进程

    我想杀死一个进程并通过以下方式获取它的 id pgrep f python myscript py 我想打电话 kill s SIGINT 对此 但我找不到任何方法来做到这一点 该命令需要在一行中 尝试使用反引号运算符来评估子命令 kill
  • BizTalk Server 有哪些可行的替代方案? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在评估不同的系统集成策略时 我听到了一些关于 BizTalk Server 的鼓励的话 但也听到了一些
  • 如何在不停止站点的情况下更新 ASP.Net 站点 dll

    是否可以在不停止 IIS 的情况下更新预编译站点的站点 dll 目前 如果我尝试复制新文件来覆盖当前文件 则所有用户在复制文件时都会收到运行时错误 有办法避免这种情况吗 即使您不停止 对 web config 文件 BIN 文件夹 App
  • 如何使用选择文件浏览器的意图来选择文件

    如何使用意图提示用户选择 完成操作 来选择应用程序来选择文件 假设设备中有几个应用程序来浏览文件 我想使用扩展名过滤文件 例如 sav props 先感谢您 你可以使用这样的东西 Intent intent new Intent Inten
  • Mongoid 查找器不工作?

    我已经设置了一个 Rails3 mongoid 应用程序 当我打开 Rails 控制台时 所有查找器似乎都不起作用 http d pr FNzC http d pr FNzC User all User find all condition
  • Channel ManagedChannelImpl 未正确关闭

    如果我运行这两个测试 我会收到错误 1st test Rule public GrpcCleanupRule grpcCleanup new GrpcCleanupRule Test public void findAll throws E
  • 没有名为“ASP.NET 4.6.81.0”的事件日志源。该模块需要.NET Framework 2.0

    我刚刚安装了 VS 2015 Community 并在尝试访问 IIS 中托管的 ASP NET 应用程序 使用 ASP NET v4 0 应用程序池 时 收到了该错误消息 我刚刚下载了 NET Framework 4 6 离线安装程序 它
  • 查找谁在调用该方法

    我想以某种方式找出哪个 CFC 正在调用我的方法 我有一个记录 CFC 它被许多不同的 CFC 调用 在此日志记录 CFC 上 需要存储哪个 CFC 调用日志 虽然我可以简单地将 CFC 名称作为参数传递给 log cfc 但我发现这是一项
  • 从 DataReader 访问 DateTime 字段时出现 MySqlConversionException

    我有一个基于 MySql 的 C 应用程序 使用MySQL 连接器 http www mysql com 我正在尝试做一个 DataReader 请求 查询执行正常 但是 当尝试访问 DateTime 字段时 我收到 MySqlConver
  • PHP Mail() 中的 Base 64 附件不起作用

    我有一个脚本 当函数运行时 它会发送一封自动电子邮件 我希望能够发送 HTML 电子邮件以及 PDF 附件 我知道我需要将文件编码为 Base64 但是我只是将 Base64 代码附加到我的电子邮件底部 我认为这与哑剧有关 有人看到这个问题
  • 如何在加载到数据表时取消合并并填充 Excel 文件中的单元格

    I have an excel file as show below 我使用以下代码将文件加载到数据表中 string sSheetName GetSheetName Get data sheet name string connStrin
  • TextInputLayout 提示颜色

    我正在使用新的 Google 设计库 com android support design 22 2 0 但遇到问题android support design widget TextInputLayout 如果我以编程方式设置其 Edit
  • 如何使用 JAXB 删除 XML 中的标签

    我正在使用 JAXB 将 java 对象转换为 xml 文件 在我的 XML 文件中 我需要删除标签不使用 XSLT 例如 删除标签订单
  • 如何在 Spring 中注入具有受保护方法的 JDK 代理类?

    我的情况相当奇怪 我使用 Spring 3 0 6 和一个实现和接口的 bean 到目前为止 都是很正常的事情 我的 bean 也有一些受保护的方法 我正在使用一些 AOP JDK 代理 一切正常 当我想将此 bean 注入另一个包类时 我
  • Angular 测试获取实际的 HTTP 响应

    我是角度单元测试的新手 我想要做的是从我的 API 获取实际结果 我检查了this https angular io guide http testing http requests文档 但据我了解 我应该创建模拟响应 这是我的代码 myS
  • Visual Studio Code 有“后退”按钮吗?

    When I Cmd click在函数的执行行 f 它带我到定义函数的地方 f 既然我已经看完了这个功能 如果有一个 后退 按钮可以回到之前的位置就太好了 有谁知道这样的功能或有帮助的功能 附 我在 Mac 上 在 Windows VS C
  • Java ME 日历不显示

    我一直在这里关注本教程 教程链接 http www developer nokia com Community Wiki Building a Java ME Canvas based calendar date picker 但我似乎无法