• 締切済み

javaでカレンダー

javaでカレンダーを作りたいのですが、 どなたかいい案があれば、教えていただけませんか? 初心者なのでCalendarクラスがよく理解できていません。 よろしくお願いします。j

  • Java
  • 回答数2
  • ありがとう数2

みんなの回答

  • foggi47
  • ベストアンサー率87% (7/8)
回答No.2

例えば5月の分のカレンダーを作りたいのなら、始めの日の曜日だけわかればあとの曜日はひとつづつずれていくだけです。 描画のほうは始めに曜日を示すラベル(日月火~)だけ作っておき、あとは空白「""」をセットしておきます。 そして曜日に応じて、日付を入れていきます。たとえば月曜日から始まるなら、はじめの日曜日は空白で、次の月曜のところに1が入るようにします。その分だけ始まるラベルをずらしておきます。 言葉で言っても分かりにくいと思うのでサンプルを作ってみました。参考にしてみてください。分からなかったらまたご質問ください。 ****** import java.awt.GridLayout; import java.util.Calendar; import javax.swing.*; public class SampleCalendar extends JFrame{ JLabel[] dayLabel = new JLabel[42]; public SampleCalendar(int YEAR, int MONTH){ super(YEAR + "年" + MONTH + "月のカレンダー"); //dayLabelを初期化 dayLabel[0] = new JLabel("日"); dayLabel[1] = new JLabel("月"); dayLabel[2] = new JLabel("火"); dayLabel[3] = new JLabel("水"); dayLabel[4] = new JLabel("木"); dayLabel[5] = new JLabel("金"); dayLabel[6] = new JLabel("土"); for(int i = 7; i < 42; i++){ dayLabel[i] = new JLabel(""); } //文字をラベルの中央に配置 for(int i = 0; i < 42; i++){ dayLabel[i].setHorizontalAlignment(SwingConstants.CENTER); } //描画に必要な、始めの曜日と日数を取得 Calendar calendar = Calendar.getInstance(); calendar.set(YEAR, MONTH - 1, 1);//MONTHは一月が0、二月が1という風になってる int firstDay = calendar.get(Calendar.DAY_OF_WEEK); int dayCount = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); //始めの曜日に応じてカウンタを回す int k = 0; switch(firstDay){ case Calendar.SUNDAY: k += 0;break; case Calendar.MONDAY: k += 1;break; case Calendar.TUESDAY: k += 2;break; case Calendar.WEDNESDAY: k += 3;break; case Calendar.THURSDAY: k += 4;break; case Calendar.FRIDAY: k += 5;break; case Calendar.SATURDAY: k += 6;break; } for(int i = k; i < k + dayCount; i++){ dayLabel[i+7].setText(i - k + 1 + "");//ちょっと卑怯な方法だけどString型に変換 } setLayout(new GridLayout(6, 7)); for(int i = 0; i < 42; i++){ add(dayLabel[i]); } } public static void main(String a[]){ SampleCalendar calendar = new SampleCalendar(2008, 2); calendar.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); calendar.setSize(300, 250); calendar.setResizable(false); calendar.setVisible(true); } }

  • foggi47
  • ベストアンサー率87% (7/8)
回答No.1

どこがわからないのかよくわかりませんがCalendarクラスは日付・時刻を管理するのに使います。 方針は、 (1)欲しい月の1日目の曜日をCalendarクラスで取得 (Calendar calendar = Calendar.getInstance(); calendar.set(2008,5,1); int day = calendar.get(DAY_OF_WEEK);) (2)その月の日数を取得 (calendar.getActualMaximum(DAY_OF_MONTH);) (3)曜日と日数から描画 とすればできなくはないと思います。 カレンダーを作ったことがないのでわかりませんが、もっとスマートな方法があるかもしれません。 どこまでの説明が必要かわからないのでわからない点があればご質問ください。

tendor
質問者

お礼

返信の方大変遅れてしまい申し訳ありません。 こんな感じでやればできるのですね。ありがとうございます。 (3)の曜日と日数から描画を詳しく教えていただきたいのですが? (1)のソースはこれでカレンダーの最初の日をセットして、 DAY_OF_WEEKをゲットすると日を全て取得できるのですか? (Calendar calendar = Calendar.getInstance(); calendar.set(2008,5,1); int day = calendar.get(DAY_OF_WEEK);)

関連するQ&A

  • Javaでカレンダー作成

    Java超初心者です。 JavaでSwingを使ってカレンダーを作ることになったんですが、 カレンダーに日付を表示する方法がわかりません。 JButtonで縦6個、横7個の計42個のボタンを作り、 そのボタン1個1個に起動した月の日付を表示する カレンダーを作りたいんです。 Calendarクラスでモデルを作った後に、そのクラスをどのように 利用してボタン1個1個に日付を表示させればいいのでしょうか? 説明してくれる方、よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaでカレンダー作成

    Javaを初めて4日目のビギナーです。 Javaを使用し、Webページ上にカレンダーを作りたいです。 上に曜日があって、左右の「次の月」、「前の月」 ボタンで月が切り替わるカレンダーです。 Calendarクラスなどを使ってできるだけシンプルに作りたいのですがなかなかうまくいきません。特に、月を切りかえるためにアンカータグでリンクを張る記述の仕方や、月が切り替わるとき最初の日付を曜日に合わせて移動させること、年が変わるときの記述などでつまづいています。 急いでいます。どうかご回答よろしくお願い致します。

  • JavaのCalendarのMONTHはなぜ0から始まるのですか

    最近Javaを学び始めたものです。 CalendarクラスのMONTHフィールドについてですが、1月から12月がそれぞれ0から11に対応しているのは、何か意味があるのでしょうか? 特に困っているわけではありませんが、なんとなく疑問になったもので。もし知っている方がおられればお願いします。

    • ベストアンサー
    • Java
  • java Calendar作成

    javaでのカレンダー作成についての質問です。 表示イメージ(_はすべて半角スペースの意です) year年month月(今回は2016年04月) _日_月_火_水_木_金_土 _______________1__2_ _3__4__5__6__7__8__9_ 10_11_12_13_14_15_16_ 17_18_19_20_21_22_23_ 24_25_26_27_28_29_30_ public class CalShow { public static void main(String[] args) { java.util.Calendar cal = java.util.Calendar.getInstance(); int year = Integer.parseInt(args[0].substring(0, 4)); int month = Integer.parseInt(args[0].substring(4)); cal.set(java.util.Calendar.YEAR, year); cal.set(java.util.Calendar.MONTH, month - 1); cal.set(java.util.Calendar.DAY_OF_MONTH, 1); //日曜日=1で土曜日=7まで int week = cal.get(java.util.Calendar.DAY_OF_WEEK); //月末日 int lastDay = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH); System.out.println( year + "年" + month + "月"); System.out.println("_日_月_火_水_木_金_土"); //日付のない日数分回す for (int i = 1; i < week ; i ++) { System.out.print("___(半角3マス)"); } String empty; //1日から月末日まで、カレンダーを表示する for (int day = 1 ; day <= lastDay ; day ++) { empty = ""; if (day < 10) { empty = "_"; } System.out.print( empty + day + "_"); ●if ( == java.util.Calendar.SATURDAY) { System.out.println(""); } } } } ●部分で土曜日なら改行、としたいのですが、 上でint weekで土曜日=7と判明しているため、 if ( week == java.util.Calendar.SATURDAY) { とか if ( day % 7 == java.util.Calendar.SATURDAY) { など色々考え付くものを書き込んでいるのですが全く上手く動作しません。 どうしたらよいのかご教授お願いいたします・・・;;

    • ベストアンサー
    • Java
  • java.util.CalendarでのgetTime結果

    お世話になります。 カレンダークラスを使用してDBへ格納するためのシリアル値を取得しようとしています。 やりたいことは任意の年月日(時分秒は無し)をPostgreSqlのDATEフィールドに日付として格納させ、レコード取得した結果の該当DATEフィールドと先ほどの任意の年月日を比較させたいのです。予想される結果は「一致」なのですがこれが不一致となってしまいます。 例えばjava.util.CalenderクラスのgetTime()を使用して取得されるシリアル値は1174611700734ですが、DBへ格納された後にレコードから取得されるデータは1174575600000となっていて比較しても不一致となってしまいます。 java.util.CalenderのgetTime()結果は実行するたびに値が異なるようで、下3桁が上記例のように"734"だったり"015"だったりします。 getTime()の結果で返されるシリアル値の下3桁を"000"とする方法はあるのでしょうか? java.util.Calendar xcal = java.util.Calendar.getInstance(); xcal.set(2007, 3 - 1, 23, 0, 0, 0); java.util.Date xday = xcal.getTime(); #xdayには"1174575600015"と格納されています。 #xdayをそのままPostgreSqlへデータ投入すると、日付のみ格納され次回取得時には"1174575600000"となります。

    • ベストアンサー
    • Java
  • java Calendarクラス

    javaで月、日を入力してカレンダーを作成したのですが 年と月のsetでmonth-1はマジックナンバーなので直したいのですが どなたかわかる方教えてください。 package sample; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Test { private final static int firstday = 1; public static void main(String[] args) { //カレンダーのインスタンスを取得します Calendar cal = Calendar.getInstance(); //文字入力 BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); //年を取得 int year =0; //月を取得 int month =0; //最後の日付 int lastDay =0; //月初めの曜日を取得 int week =0; //年妥当性チェック boolean CheckYear = true; //月妥当性チェック boolean CheckMonth = true; try { //年妥当性チェック while(CheckYear){ System.out.println("年を入力してください"); //年を入力します year = Integer.parseInt(input.readLine()); //年が4桁の場合 if(String.valueOf(year).length()==4){ CheckYear = false; }else{ System.out.println("年は4桁で入力してください"); } } //月妥当性チェック while(CheckMonth){ System.out.println("月を入力してください"); //月を入力します month = Integer.parseInt(input.readLine()); //月が1~12の場合 if(month>=1&&month<=12){ CheckMonth = false; }else{ System.out.println("月1~12を入力してください"); } } }catch(IOException e){ System.out.println("数字以外は入力しないでください"); System.out.println("処理を中断します"); return; }catch (Exception a) { System.out.println("数字以外は入力しないでください"); System.out.println("処理を中断します"); return; } //年、月をセットします cal.set(year,month-1,cal.getActualMinimum(Calendar.DATE)); //月初めの曜日を取得 week = cal.get(Calendar.DAY_OF_WEEK); //年月を出力する System.out.println(String.valueOf(year)+"年"+String.valueOf(month)+"月"); //曜日を出力する System.out.println("日 月  火  水  木  金  土"); //最後の日付を取得する lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); /* * 最後の日付を取得する */ if(month==1||month==3||month==7||month==8||month==10||month==12) { lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(month==4||month==6||month==9||month==11){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(year%4==0&&month==2){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(year%4!=0&&month==2){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); } /* * カレンダーを出力する */ //最後の日付まで繰り返す // 最後の日付まで繰り返す for (int i = 1; i <= lastDay; i++) { // 1日とそれ以外で分岐する if (i == 1) { // 1日の曜日位置まで移動する for (int j = 1; j < cal.get(Calendar.DAY_OF_WEEK); j++) { System.out.print(" "); } } else { // 日付を増やす cal.add(Calendar.DAY_OF_MONTH, firstday); } // 1~9と10~で表示を変える if (i < 10) { System.out.print(" " + i); } else { System.out.print(" " + i); } // 土曜日になったら改行する if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) { System.out.println(""); } } } }

  • JAVAとXMLの関係は

    プログラム初心者でJAVAの勉強を始めたばかりです。 JAVAの参考書を読んでいますがXMLファイルも出てきて関係性がいまいち理解できません。 JAVAプログラム(クラスファイル等)とXMLファイルの関係性を教えていただけないでしょうか。

    • ベストアンサー
    • Java
  • java コマンドライン引数を利用したカレンダー

    args[0]に例えば200805と入れたら2008年5月のカレンダーが表示される、そんなプログラムを書きたいと思っています。 理想は↓の形です。(_は空欄の意です;) 2008年5月 日 月 火 水 木 金 土 ___________1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 importは使わないよう指示が出ていますので、フルネームでカレンダークラスを記載しています。 public class CalShow { public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ java.util.Calendar cal = java.util.Calendar.getInstance(); //コマンドライン引数の前4桁をyear、 int year = Integer.parseInt(args[0].substring(0, 4)); //後ろ2桁をmonthとしてそれぞれintで定義 int month = Integer.parseInt(args[0].substring(4)); System.out.println( year + "年" + month + "月"); System.out.println(" 日 月 火 水 木 金 土"); cal.set(year, month - 1, 1); int startDay = cal.get(java.util.Calendar.DAY_OF_WEEK); cal.add(java.util.Calendar.MONTH, 1); cal.add(java.util.Calendar.DATE, -1); int lastDay = cal.get(java.util.Calendar.DATE);      /*なんとなくここまで書けたのですが、ここからどのように木曜日と1日を繋げていけばよいのか分からなくて困っています。 どういったメソッドを使えばいいのかなど、どなたか教えていただけませんでしょうか? よろしくお願いいたします。*/ } }

    • ベストアンサー
    • Java
  • javaの覚え方

    私はjavaの勉強をしている初心者ですが、困っていることがあります。 数冊のjavaの本を読んで、オブジェクト指向のことや、基本的な事 は理解したつもりですが、自分でプログラムを作成する際、 用意されているクラスだけを使い終わってしまうのです。 これは、本のサンプルをうちこんでいるだけなのです。 一からつくろうとしても、実際サンプルプログラムの ようになるのだからと思ってしまうのですが、どうすれば 自分で作ったと実感できるのでしょうか?

  • javaのカレンダー作成について

    コマンドライン引数で渡された6桁の数字をカレンダーに起こすプログラムを作成しています。 以下のように書きました。 ↓ public class Calendar { public static void main(String[] args) { java.util.Calendar cal = java.util.Calendar.getInstance(); int year = Integer.parseInt(args[0].substring(0, 4)); int month = Integer.parseInt(args[0].substring(4)); cal.set(java.util.Calendar.YEAR, year); cal.set(java.util.Calendar.MONTH, month - 1); cal.set(java.util.Calendar.DAY_OF_MONTH, 1); int week = cal.get(java.util.Calendar.DAY_OF_WEEK); //日曜始まり一週間のセット作成 int weekset = 0; if (week == cal.SUNDAY) { weekset = 0; } else if (week == cal.MONDAY) { weekset = 1; } else if (week == cal.TUESDAY) { weekset = 2; } else if (week == cal.WEDNESDAY) { weekset = 3; } else if (week == cal.THURSDAY) { weekset = 4; } else if (week == cal.FRIDAY) { weekset = 5; } else if (week == cal.SATURDAY) { weekset = 6; } //月末日 int lastDay = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH); //7日ごとに改行するカウンタ用意 int counter = 0; System.out.println( year + "年" + month + "月"); System.out.println(" 日 月 火 水 木 金 土"); //weekset分回す for (int i = 0; i < weekset; i++) { System.out.print(" "); counter ++; } //1日から月末日まで、カレンダーを表示する for (int day = 1 ; day <= lastDay; day ++) { if (day < 10) { System.out.print(" " + day + " "); } else { System.out.print( day + " "); } counter ++; if (counter == 7) { // 7日おきに改行する counter = 0; System.out.println(); } } } } きちんと動作してくれるのですが、2つ目のループ内の、 ************** for (int day = 1 ; day <= lastDay; day ++) { if (day < 10) { ●System.out.print(" " + day + " "); } else { ●System.out.print( day + " "); } ************** ●の部分の出力はループの外で一つに纏められるはずだと指摘されました。 dayの後ろの部分にだけなら、for文の前にString str = "";と宣言しておいて、 for (int day = 1 ; day <= lastDay; day ++) { str += " "; とすることで空白を付けられる気がしているのですが、前部分に空白を設定した上でまとめて出力する方法が分かりません。 お分かりになる方、どのようにすればよいのかご教授お願いいたします。 (また、上記の方法自体全く的外れということでしたらそれを含めてご教授お願いいたします・・・;;)

    • ベストアンサー
    • Java

専門家に質問してみよう