質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.20%

現在の日時の取得、使い方がわかりません

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,570

ken_66

score 29

現在パネルにカレンダーを作る事をしているのですが、
一応出力はできているのですがよく分からない月からしか出力されませんどこを直せばいいでしょうか?
お願いいたします。
イメージ説明

~~ Kenkou.java ~~

pane6 = new JPanel();//////////////////////////////////////////////////////
pane6.setBackground(new Color(176, 196, 222));
contentPane.add(pane6, "カレンダー");

JButton pane6bt1 = new JButton("ホームへ");
pane6bt1.setBounds(0, 435, 135, 39);
pane6bt1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {

pane1.setVisible(true);//タイトル
pane2.setVisible(false);//体重
pane3.setVisible(false);//記録
pane4.setVisible(false);//グラフ
pane5.setVisible(false);//一覧
pane6.setVisible(false);//日程
pane7.setVisible(false);
pane8.setVisible(false);

}
});
pane6.setLayout(null);
pane6.add(pane6bt1);

pane6lb1 = new JLabel("カレンダー");
pane6lb1.setBounds(194, 0, 325, 66);
pane6lb1.setHorizontalAlignment(SwingConstants.CENTER);
pane6lb1.setFont(new Font("MS UI Gothic", Font.PLAIN, 32));
pane6.add(pane6lb1);

paneAAA = new JPanel();
paneAAA.setBounds(12, 76, 702, 356);
pane6.add(paneAAA);
paneAAA.setLayout(new BorderLayout(0, 0));
/////////////////////////////////////////////////////////////////

Calendar c = Calendar.getInstance();
c.setTime(new Date());

//        paneAAA1 = new Month(2015,11);    //2016,0  が一月
//        paneAAA1.setBackground(new Color(240, 230, 140));
//        paneAAA.add(pane2, "name_2");

JButton pane6bt2 = new JButton("→");
pane6bt2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {

if (j<11){
j++;
paneAAA1.setMonth1(i,j);    //月入れる

p = 1;
p +=j;
//pane2.setToolTipText(i+"年"+p+"月");
////pane6lb1.setText(i+"年"+p+"月");

}else{
i++;
j=0;
paneAAA1.setMonth1(i,j);    //月入れる
p = 1;
p +=j;
//pane2.setToolTipText(i+"年"+p+"月");
////pane6lb1.setText(i+"年"+p+"月");

return;
}

}
});
pane6bt2.setBackground(new Color(175, 238, 238));
paneAAA.add(pane6bt2, BorderLayout.EAST);

JButton pane6bt3 = new JButton("←");
pane6bt3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {

if (j>0){
j--;
paneAAA1.setMonth1(i,j);    //月入れる
p = 1;
p +=j;
////pane6lb1.setText(i+"年"+p+"月");

}else{
i--;
j=11;
paneAAA1.setMonth1(i,j);    //月入れる
p = 1;
p +=j;
////pane6lb1.setText(i+"年"+p+"月");

return;
}

}
});
pane6bt3.setBackground(new Color(175, 238, 238));
paneAAA.add(pane6bt3, BorderLayout.WEST);

paneAAA1 = new Month(2015,11);//paneAAA1 = new JPanel();
paneAAA1.setBackground(Color.WHITE);
paneAAA.add(paneAAA1, BorderLayout.CENTER);

pane7 = new JPanel();//////////////////////////////////////////////////////
pane7.setBackground(new Color(176, 196, 222));
contentPane.add(pane7, "標準");
pane7.setLayout(null);

JButton pane7bt1 = new JButton("戻る");
pane7bt1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {

pane1.setVisible(false);//タイトル
pane2.setVisible(true);//体重
pane3.setVisible(false);//記録
pane4.setVisible(false);//グラフ
pane5.setVisible(false);//一覧
pane6.setVisible(false);//日程
pane7.setVisible(false);
pane8.setVisible(false);

text3.setText(null);
pane7lb3.setText("あなたの標準体重は・・・");

}
});

pane7bt1.setBounds(0, 427, 135, 47);
pane7.add(pane7bt1);


~~ Month.java ~~~

package kenkou;

import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.util.Calendar;

import javax.swing.JLabel;
import javax.swing.JPanel;

public class Month extends JPanel {            //JPanelを継承        ※Pane2の内容↓

JLabel la[][] = new JLabel[7][7];        //JLabelの2次元配列
String data[][] = new String[7][7];        //Stringの2次元配列
//JButton bt[][] = new JButton[7][7];
JLabel b[][] = new JLabel[7][7];
CalendarModel cm;

//int year1;
//int month1;

public Month(int year, int month) {        //コンストラクタはクラス名と同じにする
setLayout(new GridLayout(7, 7, 0, 0));     // 7行7列

Calendar calendar = Calendar.getInstance();
year = calendar.get(Calendar.YEAR)+1;
month = calendar.get(Calendar.MONTH)+1;

for(int i = 0; i < 7; i++){            //2重ループ
for(int j = 0; j < 7; j++){
b[i][j] = new JLabel();
//b[i][j] = new JLabel();
add(b[i][j]);
//add(b[i][j]);
b[i][j].setText(""+i+j);
b[i][j].setFont(new Font("MSゴシック",Font.ITALIC,28));  //MSゴシック
if(0 ==i){
b[i][j].setFont(new Font("MSゴシック",Font.BOLD,28));
}
if(0 == j){
b[i][j].setForeground(Color.RED);//日曜
}
if(6 == j){
b[i][j].setForeground(Color.BLUE);//土曜
}

}
}
//year=2016;
month+=1;
cm = new CalendarModel(year,month);
data = cm.getData();
int s=2016;
int a=1;
setToolTipText(s+"年"+a+"月");
for(int i = 0; i < 7; i++){
for(int j = 0; j < 7; j++){
b[i][j].setText(data[i][j]);
}
}
}

public void setMonth1(int year, int month) {    //次の月
cm.setCalendar(year, month);//setCalendar
data = cm.getData();

for(int i = 0; i < 7; i++){            //2重ループ
for(int j = 0; j < 7; j++){
b[i][j].setText(data[i][j]);
}
}
}

public void setMonth2(int year1, int month1) {    //前の月
cm.setCalendar(year1, month1);//setCalendar
data = cm.getData();

for(int i = 0; i < 7; i++){            //2重ループ
for(int j = 0; j < 7; j++){
b[i][j].setText(data[i][j]);
}
}
}

public String[][] getData() {
return data;
}
}


~~ CalendarModel.java ~~

package kenkou;

import java.util.Calendar;        
import java.util.Date;

class CalendarModel {
private String[] columnNames = {"日", "月", "火", "水", "木", "金", "土"};
private Calendar c = Calendar.getInstance();
private String[][] data;//String
private int startDay;
private int endDay;

Date date;

CalendarModel(int year ,int month) {
this.setCalendar(year, month);

}

public String[] getColumnNames(){
return columnNames;

}

public String[][] getData() {
return data;
}

public void setCalendar(int year, int month){///////////////////////setCalendar

//Calendar c = Calendar.getInstance();
//c.setTime(new Date());

data = new String[7][7];

for(int i = 0; i < columnNames.length ; i++){
data[0][i] = String.format("%2s", columnNames[i]);

System.out.print(data[0][i]);
}
System.out.println("");

c.set(year, month,1);                
startDay = c.get(Calendar.DAY_OF_WEEK);        

c.add(Calendar.MONTH, 1);                
c.add(Calendar.DATE, -1);                
endDay = c.get(Calendar.DATE);                

int row = 1;
int column = startDay - 1;

for (int date = 1; date <= endDay; date++) {
data[row][column] = String.format("%3s", String.valueOf(date));
if (column == 6) {
row++;
column = 0;
} else {
column++;
}

System.out.print(date + " ");
if(date == 7 || date == 14 || date == 21 || date == 28){
System.out.println("");
}

}
}
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2016/07/26 10:56

    コードをマークアップして下さい。コードを選択して</>ボタンを押せば見やすくなります。

    キャンセル

回答 3

checkベストアンサー

+1

Kenkou.javaのコード上にある変数pane6bt2で宣言されているボタンのイベント内で変数jをインクリメントされていますが、そもそもこの変数jはどこから来たのでしょうか?
インクリメントされる前の値は表示しているカレンダーの月と一致していますか?

Month.javaのコードで定義されているパネルが画面中央のカレンダー表示本体だと思いますが・・・
見直すポイントは、次のようなコードだと思います。

year = calendar.get(Calendar.YEAR)+1;
month = calendar.get(Calendar.MONTH)+1; 
...
month+=1;

+1 されていますが、本当に必要な+1なのでしょうか?

Eclipseをお使いなのであれば、要所要所にブレークポイントを付けて、デバッグしてみましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

new Month(2015, 11)でカレンダー画面を作ろうとしているのでしょうが、そのコンストラクタ内で引数を使わず、Calendar.getInstance()で取得した時刻(つまりシステムの現在時刻)のまま年月を使ってしまい、引数を上書きしてしまっています。getでCalendarから年月を取得していますが、逆にCalendarに対してsetを実行するべきところではないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/27 10:18

    編集画面でコードの部分を選択状態にする→</>を押す
    これだけです。

    キャンセル

  • 2016/07/27 16:55

    また返信遅くなり申し訳ありません。
    swordoneさんが言われていたmonthに+1されているのは本当に+1なのかCalender.getInstance()で取得した値をそのまま使い引数を上書きしているなどこの点を考えていたら出来るようになりました!
    上の助言のおかげです!
    monthに+1はサイトに載っていたのでこのままでいいと思い込んでしまっていたのでとても助かりました。
    本当に有難うございました!

    キャンセル

  • 2016/07/28 00:12

    それ私の回答では無いですよ。
    そしてコードを見やすくして下さい
    そこまで難しい指示はしてないはずです。

    キャンセル

0

Month.java

import java.awt.Color; 
import java.awt.Font; 
import java.awt.GridLayout; 

import javax.swing.JLabel; 
import javax.swing.JPanel;

public class Month extends JPanel {//JPanelを継承
    JLabel b[][] = new JLabel[7][7]; 
    CalendarModel cm = new CalendarModel();
    /*
     * 指定された年と月で初期化します
     * @param year
     * @param month 
     */
    public Month(int year,int month) { 
        super.setLayout(new GridLayout(7, 7, 0, 0));     // 7行7列
        for(int i = 0; i < 7; i++){            //2重ループ 
            for(int j = 0; j < 7; j++){ 
                b[i][j] = new JLabel();
                super.add(b[i][j]); 
                b[i][j].setFont(new Font("MSゴシック",Font.ITALIC,28));  //MSゴシック 
                if(0 ==i){ 
                    b[i][j].setFont(new Font("MSゴシック",Font.BOLD,28)); 
                } 
                if(0 == j){ 
                    b[i][j].setForeground(Color.RED);//日曜 
                } 
                if(6 == j){ 
                    b[i][j].setForeground(Color.BLUE);//土曜 
                }
            } 
        }
        cm.setCalendar(year, month);
        this.create();
    }
    /*
     * 今月で初期化されます
     */
    public Month(){
        super.setLayout(new GridLayout(7, 7, 0, 0));     // 7行7列
        for(int i = 0; i < 7; i++){            //2重ループ 
            for(int j = 0; j < 7; j++){ 
                b[i][j] = new JLabel();
                super.add(b[i][j]); 
                b[i][j].setFont(new Font("MSゴシック",Font.ITALIC,28));  //MSゴシック 
                if(0 ==i){ 
                    b[i][j].setFont(new Font("MSゴシック",Font.BOLD,28)); 
                } 
                if(0 == j){ 
                    b[i][j].setForeground(Color.RED);//日曜 
                } 
                if(6 == j){ 
                    b[i][j].setForeground(Color.BLUE);//土曜 
                }
            } 
        }
        this.create();
    }
    /*
     * 来月に進みます
     */
    public void nextMonth(){
        if(cm.getMonth()!=12){
            cm.setCalendar(cm.gatYear(),cm.getMonth()+1);
        }else{
            cm.setCalendar(cm.gatYear()+1,1);
        }
        create();
    }
    /*
     * 先月に戻ります
     */
    public void lastMonth(){
        if(cm.getMonth()!=1){
            cm.setCalendar(cm.gatYear(), cm.getMonth()-1);
        }else{
            cm.setCalendar(cm.gatYear()-1, 12);
        }
        create();
    }
    /*
     * 指定された年と月に設定します
     * @param year
     * @param month 
     */
    public void setCalendar(int year,int month){
        cm.setCalendar(year, month);
        create();
    }
    /*
     * 現在に指定する
     */
    public void setNow(){
        cm.setNow();
    }
    /*
     * 内部処理
     */
    private void create(){
        String[][] data = cm.getData(); 
        int s=cm.gatYear(); 
        int a=cm.getMonth(); 
        super.setToolTipText(s+"年"+a+"月"); 
        for(int i = 0; i < 7; i++){ 
            for(int j = 0; j < 7; j++){ 
                b[i][j].setText(data[i][j]); 
            }
        }
    }
}


CalendarModel.java

import java.util.Calendar;         

public class CalendarModel { 
    public final static String[] columnNames = {"日", "月", "火", "水", "木", "金", "土"}; 
    private Calendar c = Calendar.getInstance(); 
    //private int year,month;
    private String[][] data;
    private boolean changed;
    /*
     * 指定した年と月で初期化されます
     * @param year
     * @param month 
     */
    public CalendarModel(int year ,int month) { 
        this.setCalendar(year, month);
    }
    /*
     * 現在の日付で初期化されます
     */
    public CalendarModel(){
        this.setCalendar(c.get(Calendar.YEAR),c.get(Calendar.MONTH)+1);
    }
    /*
     * 
     * @return 指定されている年
     */
    public int gatYear(){
        return c.get(Calendar.YEAR);
    }
    /*
     * 
     * @return 指定されている月
     */
    public int getMonth(){
        return c.get(Calendar.MONTH)+1;
    }
    /*
     * データを取得します
     * @return 
     */
    public String[][] getData() {
        //メモ化
        if(changed){
            create();
            changed=false;
            return data;
        }else{
            return data; 
        }
    }
    /*
     * 指定した年と月に設定します
     * @param year
     * @param month 
     */
    public final void setCalendar(int year, int month){
        changed=true;
        c.set(year, month-1,1);//始めの日を設定
    }
    public void setNow(){
        c=Calendar.getInstance();
    }
    /*
     * 内部処理
     */
    private void create(){
        data=new String[7][7];//初期化
        data[0]=columnNames;//曜日を全部代入
        int lastday=c.getActualMaximum(Calendar.DATE);//最終日を取得
        int week=c.get(Calendar.DAY_OF_WEEK)-1;//曜日を取得
        int day=1;
        while(day<=lastday){
            data[week/7+1][week%7]=String.format("%2s", String.valueOf(day));
            day++;week++;
        }
    }
}


かなりつくりかえましたがもともとあった機能は大体そろってると思います
何をしたいのかよくわからなかったけどね・・

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/27 17:05

    返信遅くなり申し訳ありません。
    助言有難うございました。
    載せていただいたコードを
    自分のコードと見比べてtsukkaの方と違うところは検索して調べたり自分の違うところには載せていただいたコードを一部使わせていただきました。
    おかげでちゃんと動くようになりました!
    すごく助かりました。
    本当に有難うございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る