2

私はここでこのチュートリアルに従っています:チュートリアルへのリンク。ただし、アプリケーションを正しく表示できないようです。アプリケーションを実行すると、チュートリアルの CalendarCanvas のような画面が表示されるはずですが、次のようになります。

ここに画像の説明を入力

これが私のコードです。標準の MIDP クラスを使用しています。

クラス 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
    }

クラス 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();
  }
}} 
4

1 に答える 1

1

クラスのコードCreateCalendar非常に問題があるようです。

前の質問で、チュートリアルのコードに加えられた小さな変数名の違いについて言及しましたが、コード スニペットに示されているものからすると、そうではありません。

チュートリアル コードを再利用する方法を見つけるには、最も簡単な方法は次のようになります。

  1. ソース コードをチュートリアルからコピーします - ファイル CalendarWidget.java および CalendarCanvas.javaをそのまま
    コピーし、必要に応じてパッケージ ステートメントのみを調整します。

  2. CalFrontEnd以下のように修正

    • 必要に応じて、CalendarCanvas の import ステートメントを追加します
    • 次のように、startApp の現在のコードを CalendarCanvas の最も単純な呼び出しに置き換えます。
      public void startApp() {
           Display.getDisplay(this).setCurrent(
                   new CalendarCanvas(this));
       }
  3. MIDlet が CalendarCanvas に期待するものを示すまで、コードをテストし、調整して修正します。

  4. 上記が完了したら、さらにニーズに合わせてコードを変更します。
    行った変更をテストして、実際に期待どおりに機能することを確認することを忘れないでください。
于 2012-04-29T10:49:57.893 に答える