Javaでカレンダーを作っているのですがエラーが出ました。
エラー内容は
Exception in thread "main" java.lang.NoClassDefFoundError: CalendarCell
at CalendarSystem.<init>(CalendarSystem.java:17)
at CalendarSystem.main(CalendarSystem.java:44)
Caused by: java.lang.ClassNotFoundException: CalendarCell
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 2 more
と出てきました。
明らかにCalendarCellというクラスがおかしいのですが修正の仕方がわかりません。
修正に必要と思われるコードは
CalendarSystem
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CalendarSystem extends JFrame implements WindowListener{
private CalendarPanel cp;
public CalendarSystem(){
super("Calendar System SP6");
setSize(600,500);
setLocation(100,100);
addWindowListener(this);
cp=new CalendarPanel();
WeekPanel wp=new WeekPanel();
ControlPanel cop=new ControlPanel(cp,this);
cp.setControlPanel(cop);
cp.setYearMonth(2020,6);
JPanel p=new JPanel();
p.setLayout(new BorderLayout());
p.add(wp,BorderLayout.NORTH);
p.add(cp);
add(p);
add(cop,BorderLayout.NORTH);
}
public void windowOpened(WindowEvent ev){}
public void windowClosing(WindowEvent ev){
cp.saveSchedules();
dispose();
}
public void windowClosed(WindowEvent ev){}
public void windowActivated(WindowEvent ev){}
public void windowDeactivated(WindowEvent ev){}
public void windowIconified(WindowEvent ev){}
public void windowDeiconified(WindowEvent ev){}
public static void main(String[] args){
(new CalendarSystem()).setVisible(true);
}
}
CalendarCell
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class CalendarCell extends JPanel{
private Calendar date;
private JPanel panel;
public CalendarCell(){
setBackground(Color.white);
setLayout(new FlowLayout(FlowLayout.LEFT));
panel=new JPanel();
panel.setLayout(new GridLayout(0,1));
setLayout(new BorderLayout());
add(panel,BorderLayout.NORTH);
}
public void setDate(int y,int m,int d){
date=Calendar.getInstance();
date.set(y,m-1,d);
int dow=date.get(Calendar.DAY_OF_WEEK);
JLabel l=new JLabel(""+d);
if(dow==Calendar.SUNDAY)
l.setForeground(Color.red);
if(dow==Calendar.SATURDAY)
l.setForeground(Color.blue);
panel.add(l); /*D ラベルを置く*/
}
public void clear(){
panel.removeAll();
}
public void addSchedule(Schedule sc){
panel.add(ScheduleLabel(schedule)); /*E パネルに追加*/
}
}
CalendarPanel
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.io.*;
import java.text.*;
public class CalendarPanel extends JPanel{
private CalendarCell[][] cc;
private ControlPanel cop;
private int current_year,current_month;
private ArrayList<Schedule> sc_list;
public CalendarPanel(){
setLayout(new GridLayout(6,7,1,1));
cc=new CalendarCell[6][7];
for(int i=0;i<6;i++)
for(int j=0;j<7;j++)
add(cc[i][j]=new CalendarCell());
sc_list=new ArrayList<Schedule>();
loadSchedules();
/*ファイルから予定を読む?*/
}
public void setControlPanel(ControlPanel cop){
this.cop=cop;
}
public void setYearMonth(int y,int m){
Calendar cal=Calendar.getInstance();
cal.set(y,m-1,1);
int dow=cal.get(Calendar.DAY_OF_WEEK);
int d_max=cal.getActualMaximum(Calendar.DATE);
int d=1;
clearAllCells();
for(int i=0;i<6;i++){
for(int j=0;j<7;j++){
if(i==0 && Calendar.SUNDAY+j<dow)
continue;
if(d>d_max) continue;
cc[i][j].setDate(y,m,d);
d++;
}
}
current_year=y;
current_month=m;
addAllSchedulesToCell();
validate();
repaint();
}
public void clearAllCells(){
for(int i=0;i<6;i++)
for(int j=0;j<7;j++)
cc[i][j].clear(); /*C removeAll?*/
}
public void setYear(int y){
setYearMonth(y,current_month);
}
public void setMonth(int m){
setYearMonth(current_year,m);
}
public void nextyear(){
setYearMonth(++current_year,current_month);
}
public void prevYear(){
setYearMonth(--current_year,current_month);
}
public void nextMonth(){
if(++current_month>12){
current_year++;
current_month=1;
}
setYearMonth(current_year,current_month);
}
public void prevMonth(){
if(--current_month<1){
current_year--;
current_month=12;
}
setYearMonth(current_year,current_month);
}
private CalendarCell getCell(Schedule sc){
int m=sc.getMonth();
int d=sc.getDate();
if(m!=current_month) return null;
Calendar cal=Calendar.getInstance();
cal.set(current_year,m-1,1);
int dow=cal.get(Calendar.DAY_OF_WEEK);
int d_max=cal.getActualMaximum(Calendar.DATE);
int p=dow+d-Calendar.SUNDAY-1;
int i=p/7;
int j=p%7;
return cc[i][j];
}
private void addAllSchedulesToCell(){
for(Schedule sc:sc_list){
CalendarCell cc=getCell(sc);
if(cc==null) continue;
cc.addSchedule(sc);
}
}
public void addSchedule(Schedule sc){
sc_list.add(sc);
CalendarCell cc=getCell(sc);
if(cc!=null)
cc.addSchedule(sc);
}
private String file_name="schedules.csv";
public void saveSchedules(){
try{
PrintWriter pw=new PrintWriter(new FileWriter(file_name));
pw.println(sc_list.size());
for(Schedule sc:sc_list){
pw.println(sc.toCSV());
}
pw.close();
}catch(IOException e){
System.err.println(e);
}
}
public void loadSchedules(){
try{
sc_list.clear();
BufferedReader br=new BufferedReader(new FileReader(file_name));
int n=Integer.parseInt(br.readLine());
for(int i=0;i<n;i++){
Schedule sc=new Schedule(br.readLine());
sc_list.add(sc);
}
br.close();
}catch(IOException e){
System.err.println(e);
}catch(ParseException e){
System.err.println(e);
}
}
}
ScheduleLabel
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ScheduleLabel extends JLabel{
private Schedule sc;
public ScheduleLabel(Schedule s){
sc=s;
setText(sc.toShortString());
setBackground(Color.white);
setOpaque(true);
}
}
Schedule
import java.text.*;
import java.util.*;
public class Schedule{
private String title;
private Date date;
private boolean allday;
private String place;
private String memo;
public Schedule(String ti,String dt,String tm,boolean ad,
String pl,String dl) throws ParseException {
title=ti;
SimpleDateFormat sdf;
sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm");
date=sdf.parse(dt+" "+tm);
allday=ad;
place=pl;
memo=dl;
}
public Schedule(String csv) throws ParseException {
fromCSV(csv);
}
public int getYear(){
Calendar cl=Calendar.getInstance();
cl.setTime(date);
return cl.get(Calendar.YEAR);
}
public int getMonth(){
Calendar cl=Calendar.getInstance();
cl.setTime(date);
return cl.get(Calendar.MONTH)+1;
}
public int getDate(){
Calendar cl=Calendar.getInstance();
cl.setTime(date);
return cl.get(Calendar.DATE);
}
public void fromCSV(String csv) throws ParseException {
String[] tok=csv.split(",");
title=tok[0];
SimpleDateFormat sdf;
sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm");
date=sdf.parse(tok[1]);
allday=tok[2].equals("1");
place=tok[3];
memo=tok[4].replace("<<NEWLINE>>","\n");
}
public String toCSV(){
String memo2=memo.replace("\n","<<NEWLINE>>");
SimpleDateFormat sdf;
sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm");
return title+","
+sdf.format(date)+","
+(allday?"1":"0")+","
+place+","
+memo2;
}
public String toString(){
return "名称:"+title+"\n"+
"日時: "+date+"\n"+
"終日: "+(allday?"○":"×")+"\n"+
"場所: "+place+"\n"+
"メモ: "+memo+"\n";
}
public String toShortString(){
if(allday)
return title;
SimpleDateFormat sdf;
sdf=new SimpleDateFormat("HH:mm");
return sdf.format(date)+" "+title;
}
}
解決していただけましたら宜しくお願いいたします。
追記
<IT技術の処方箋:NoClassDefFoundErrorへの対処>
C:\java>java HelloWorld
Exception in thread
"main" java.lang.NoClassDefFoundError: HelloWorld
エラーの原因として、考えられる理由は二つです。
まずは、HelloWorldのスペルはあっていますか?
HelloWorld.classというファイルが本当に存在しますか?
次に考えられるのが、クラスパスです。
クラスパスの詳細は省きますが、
かりに、
C:\java>java -classpath c:\java HelloWorld
Hello World!
として、うまくいくようなら、間違いなくクラスパスの問題です。
クラスパスとは、HelloWorld.classファイルがどこのディレクトリに存在するかを教える仕組みです。
上の例でいうと、-classpath c:\java とすることで、
c:\javaディレクトリに、HelloWorld.classファイルが
存在しますよ、と明示的に示しています。
ちなみに、↓でも同じ結果になります。
C:\java>java -classpath . HelloWorld
Hello World!
こちらの場合は、-classpath . が、現在(カレント)の
ディレクトリを表します。
あと他の理由としては、
packageを無視していることも考えられます。
例えば、
C:\workspace\test\bin\info\searchman\HelloWorld.class
があって、
HelloWorldのpackageが
info.searchmanとするなら、
以下のような感じで実行できるはずです。
cd c:\workspace\test\bin
C:\workspace\test\bin>java info/searchman/HelloWorld
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
まだ回答がついていません
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.20%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正の依頼
m.ts10806
2020/08/14 05:00
>明らかにCalendarCellというクラスがおかしいのですが
それはエラーをどこまで理解してのコメントでしょうか?明らかにおかしいのであれば対応方法まで分かっているはずでは?
※意地悪ではなく、質問内容そのまま理解した上でのコメントです
andersong
2020/08/14 05:18
返信ありがとうございます。
エラーの内容にCalendarCellというクラスしか載っていなかったためそうなのだと思いました。
自分でも調べてみたのですが今まで出てこなかったエラーでしたので対処法がよく理解できませんでした。
m.ts10806
2020/08/14 05:26
エラー名調べてみたのでしたら、その内容と確認した記事を質問本文に追記してください。
NoClassDefFoundError
andersong
2020/08/14 05:37
追記させてもらいました
javahack
2020/08/14 09:01
対処方法をコピーして追記で終わりではなく、それを見て自分がどう理解して原因を調べたのか書かないと意味がありません。
今のままでは単なる丸投げです。
yureighost
2020/08/14 12:20
ソースを貼っていますが、内容からすると環境が原因の実行時エラーであり、
追記以降に書いてある別なサイトから探してきた文のHelloWorldの部分を
CalendarCellに置き換えて考えることが解決の早道になると思います。
YT0014
2020/08/14 12:33
javaにおけるpackageの概念を正確にご理解されるよう努めてみてください。
ironya
2020/08/16 20:57
ControlPanel というクラスを使っていますが、import もしてないし、ソースもありません。
ソースファイル全体がエラーなくコンパイルできているかどうかわかりますか?