Java ME日历不显示 [英] Java ME Calendar not displaying

查看:156
本文介绍了Java ME日历不显示的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在这里学习本教程:您提到了少数变量名称差异



为了找到一种重用教程代码的方法,最直接的方法就是使用教程代码,而不是从代码片段中显示的代码,如下所示。


  1. 从教程 - 文件CalendarWidget.java和CalendarCanvas.java复制源代码

    原样复制,仅在必要时调整包语句。


  2. 修改 CalFrontEnd 约如下




    • 如果需要,请为CalendarCanvas添加import语句

    • 使用对CalendarCanvas的最简单调用替换startApp中的当前代码,如下所示:

       
      public void startApp(){
      Display.getDisplay(this).setCurrent(
      new CalendarCanvas(this));
      }


  3. 测试代码,调整并修正,直到MIDlet显示您对CalendarCanvas的期望


  4. 完成上述操作后,继续修改代码以进一步匹配您的需求。

    不要忘记测试


I've been following this tutorial here: Link to tutorial. I can't seem to get the application displaying properly though. When I run the application I expect to see a screen like CalendarCanvas from tutorial, but I get this:

Here is my code, I'm using standard MIDP classes.

Class CreateCalendar:

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
    }

Class CalFrontEnd (extends 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();
  }
}} 

解决方案

Code in the class CreateCalendar looks very problematic.

In prior question you mentioned few minor variable name differences done to code from tutorial, but from what is shown in your code snippet, this is not so.

To find a way to reuse tutorial code, most straightforward approach would be like as follows.

  1. Copy the source code from tutorial - files CalendarWidget.java and CalendarCanvas.java
    Copy as-is, only adjust the package statements if necessary.

  2. Modify CalFrontEnd about as follows

    • if needed, add import statement for CalendarCanvas
    • replace current code in startApp with simplest invocation for CalendarCanvas, like this:

       public void startApp() {
           Display.getDisplay(this).setCurrent(
                   new CalendarCanvas(this));
       }

  3. Test the code, tune and fix it until your MIDlet shows what you would expect of CalendarCanvas

  4. After above is done, proceed with modifying the code to further match your needs.
    Don't forget to test the changes you make, to make sure that things indeed work as you expect.

这篇关于Java ME日历不显示的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆