javaでカレンダーのGUIアプリケーションに挑戦中です。こちらの翌月ボタンを押したときに、カレンダー表示部分を変更したいのですが、上手く変更ができません。翌月ボタンを押すと新しいframe?(表現があっていますか?)が出てきて翌月のカレンダーが表示されることはできたのですが、何枚も同じframe?を表示させるのではなく。使ってカレンダー部分と左上の年月だけ変えたものを表示させたいです。
あと日にち部分を作成するコードが長く綺麗ではないので上手く書いたり、もっと継承や実装をしてクラスを分けてカプセル化?をしていきたいのですが、今までしたことないのでよくわかっていないです。どなたか教えていただけますでしょうか。何かコード等ヒントもあれば非常に助かります。よろしくお願いします。
package calPro3.calPack; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; public class JFtesttttt extends JFrame implements KeyListener{ JPanel panel_1 = new JPanel(); private JPanel contentPane; public static int curYear; public static int curMonth; // 6×7 42個のJLabel作成 JLabel lbl42 [] = new JLabel[42]; /** * Launch the application. */ public static void main(String[] args) { new JFtesttttt(); } public JFtesttttt() { //Calendarクラスから現在年月日を取得し curYear,curMonthに代入 // Calendar cal = Calendar.getInstance(); curYear = 2023; //cal.get(Calendar.YEAR); curMonth = 2; //cal.get(Calendar.MONTH) +1; int dayNum = 0; System.out.println(curYear+" cuYear 年 "+curMonth +" curMonth 月"); //1月から12月までの一か月の日数を変数dayNumに代入 int jan=31,febHeinen=28,febUruu=29,mar=31,apr=30,may=31,jun=30,jul=31,aug=31,sep=30,oct=31,nov=30,dec=31; //SWITCH文で現在月curMonthから日数を取得 switch(curMonth) { case 1: dayNum = jan; break; //2月が28か29を調べる case 2: dayNum = febHeinen; if(curYear % 4 == 0) { if(curYear % 100 == 0) { if(curYear % 400 ==0) { dayNum = febUruu; } }else { dayNum = febUruu; } } break; case 3: dayNum = mar; break; case 4: dayNum = apr; break; case 5: dayNum = may; break; case 6: dayNum = jun; break; case 7: dayNum = jul; break; case 8: dayNum = aug; break; case 9: dayNum = sep; break; case 10: dayNum = oct; break; case 11: dayNum = nov; break; case 12: dayNum = dec; break; } System.out.println("日数は dayNum "+dayNum); setTitle("万年カレンダー3"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 500, 400); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); //カレンダー日付部 //日にちを表示するためjpanelをインスタンス化、コンテントペインにadd //JPanel panel_1 = new JPanel(); panel_1.setBounds(12, 126, 460, 225); contentPane.add(panel_1); panel_1.setLayout(new GridLayout(6, 7, 0, 0)); //ツェラーの公式を使い何曜日から始まるか firstBlankを求める int tYear = curYear; int tMonth = curMonth; int tDate = 1; if(tMonth == 1 || tMonth == 2) { tYear --; tMonth += 12; } int firstBlank = (tYear + tYear / 4 - tYear / 100 + tYear / 400 + (13 * tMonth + 8) / 5 + tDate) %7; System.out.println("最初の空白は「 " + firstBlank + " 」日分"); // firstBlank の個数分 * をラベルインスタンスを作り、パネルにadd for(int i = 0; i < firstBlank; i++) { String str = "+"; lbl42[i] = new JLabel(str); panel_1.add(lbl42[i]); } // dayNum の個数分 日にちのラベルインスタンスを作りパネルにadd for(int i = 0; i < dayNum;i++) { String str = Integer.toString(i + 1); lbl42[firstBlank + i] = new JLabel(str); panel_1.add(lbl42[firstBlank + i]); } int lastBlank = lbl42.length -dayNum - firstBlank; System.out.println("最後の空白は「 " + lastBlank + " 」日分"); for(int i = 0; i < lastBlank; i++) { String str = "-"; lbl42[firstBlank + dayNum + i] = new JLabel(str); panel_1.add(lbl42[firstBlank + dayNum + i]); } JButton btnNewButton_4 = new JButton("翌月↓"); btnNewButton_4.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // new CalNextMonth2 (); System.out.println("ボタンプッシュ"); String str = "@@@"; lbl42[1] = new JLabel(str); panel_1.add(lbl42[1]); setVisible(true); } }); btnNewButton_4.setBounds(278, 39, 91, 21); contentPane.add(btnNewButton_4); JLabel lblNewLabel_7 = new JLabel(curYear+ "年" + curMonth +"月"); lblNewLabel_7.setBounds(12, 9, 91, 21); contentPane.add(lblNewLabel_7); //最初の表示setVisible キーボードアクション setFocusable設定 setFocusable(true); setVisible(true); addKeyListener(this); } @Override public void keyTyped(KeyEvent e) { // TODO 自動生成されたメソッド・スタブ } @Override public void keyPressed(KeyEvent e) { switch ( e.getKeyCode() ) { case KeyEvent.VK_DOWN: System.out.println("下が押されました"); //new CalNextMonth2 (); break; } } @Override public void keyReleased(KeyEvent e) { // TODO 自動生成されたメソッド・スタブ } }
回答2件
あなたの回答
tips
プレビュー