Java ME Calendar not displaying

北城余情 提交于 2019-12-12 19:17:59

问题


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

回答1:


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.


来源:https://stackoverflow.com/questions/10366414/java-me-calendar-not-displaying

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!