- ベストアンサー
ラベルに日付を表示
こんばんは、この前質問したばかりですが どうしてもわからないので よろしくお願いします。 ラベルに今日の日付を表示するようなプログラム はこの様なコーディングだと思ったのですが、 コンパイルできませんでした。 どなたか、正しい方法を教えていただけないでしょうか。 import java.util.*; import javax.swing.*; import java.awt.*; class timelabel { JFrame frame=new JFrame(); JLabel label=new JLabel(); Calendar cld = Calendar.getInstance(); label.setText(cld.get(Calendar.DATE)); frame.setVisible(true); }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>日付の日の部分だけ表示したかったのですが >(例:2006/5/28⇒28) >もう少しだけ教えていただけませんか? >「DATE」のクラスライブラリを見ても、 >よくわかりませんでした。 なるほど。Dateクラスのメソッドはほとんどが非推奨ですね。とりあえず回答を2つ用意しましょう。 1)非推奨であるが、DateクラスのgetDate()メソッドを使う これでも(一応)できます。 2)Dateクラスではなく、Calendarクラスを使う 「JDK バージョン 1.1 以降は、Calendar.get(Calendar.MONTH) に置き換えられました。 」と書かれていますね?これを使ってみます。 ただし、Calendarクラスのgetメソッドを見てもらえればわかるように、このメソッドはstaticではありません。つまり、「Calendar.get(Calendar.MONTH) 」と直接書くことはできません。一旦Calendarクラスのインスタンスを取得します。ただし、Calendarクラスは抽象クラスなので、 Calendar cal=new Calendar(); と言う風に直接newすることはできません。私が知る限りの方法を・・ 2-1)CalendarクラスのサブクラスであるGregorianCalendarクラスのオブジェクトを作る GregorianCalendarクラスは抽象クラスではありません。つまり、 Calendar cal=new GregorianCalendar(); と書くことができます。 2-2)CalendarクラスのgetInstance()メソッドを使う Calendarクラスは抽象クラスですが、staticなgetInstance()メソッドを用意しています。つまり、 Calendar cal=Calendar.getInstance(); と書くことができます。 (ただし、Calendar.getInstance()は基本的に内部でGregorianCalendarをnewします。つまり、やっていることはほとんど変わりません。) 無事Calendarクラスのインスタンスを取得できたので、あとは、 cal.get(Calendar.MONTH) と書けば日が取得できます。 ここで注意してもらいたいのが、両方ともintを返すと言うことです。つまり、JLabel(int)というコンストラクタはないため、一旦 new Integer(int).toString() として、Stringに変形しましょう。 つまり、 //3つのうちどれでもよい //int date=new Date().getDate(); int date=new GregorianCalendar().get(Calendar.DATE); //int date=Calendar.getInstance().get(Calendar.DATE); this.getContentPane().add(new JLabel(new Integer(date).toString())); でできます。
その他の回答 (3)
- Bonjin
- ベストアンサー率43% (418/971)
#1です。 すみません。1.5の環境だとエラーが出ないので・・・ 1.4でコンパイル・実行したら確かにエラーが出ますね。 エラーの内容については#2さんの書かれているとおりです。
- freedom560
- ベストアンサー率46% (80/173)
英語に書いてあることそのままなんですが・・ Do not use timelabel.add() --------- --------------- 使うな timelabelクラスのadd()メソッドを use timelabel.getContentPane().add() instead ------------------------------- ------- timelabel.getContentPane().add()を使え 代わりに ・・そのままですね。 つまり、 add(new JLabel(new Date().toString())); の代わりに getContentPane().add(new JLabel(new Date().toString())); を使わなければなりません。 この理由は下のHPにある「JFrame クラスは Frame と多少互換性のない~」の辺りに書いてあります。まぁ、読んでも「なんのこっちゃい?」っていう感じだと思うので、swingではadd(Component comp) メソッドを直接は使えず、一旦getContentPane()メソッドでオブジェクト(Containerクラスか、そのサブクラス)をとってきた後、このオブジェクトのadd(Component comp)メソッドを呼び出さなければいけないと覚えておくとよいでしょう。
お礼
ご回答ありがとうございます。 お礼遅れて申し訳ございません。 おかげさまで、正しく実行されました。 ごめんなさい、ちょっと言葉が足りなかったのですが 日付の日の部分だけ表示したかったのですが (例:2006/5/28⇒28) もう少しだけ教えていただけませんか? 「DATE」のクラスライブラリを見ても、 よくわかりませんでした。 御礼遅れておきながら 大変恐縮でございますが どうか、よろしくお願いします。
- Bonjin
- ベストアンサー率43% (418/971)
とりあえず、初心者向けの参考書なりWebの解説ページなりを見て基本的なことを学んでみてはいかがですか? 一応、動くソースを・・・ import java.util.Date; import javax.swing.JFrame; import javax.swing.JLabel; public class Timelabel extends JFrame { public static void main(String[] args){ new Timelabel(); } public Timelabel(){ super("Timelabel"); add(new JLabel(new Date().toString())); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); } }
補足
Bonjinさん、ご回答ありがとうございます。 コンパイルできるのですが、残念ながら Exception in thread "main" java.lang.Error: Do not use timelabel.add() use timel abel.getContentPane().add() instead at javax.swing.JFrame.createRootPaneException(JFrame.java:465) at javax.swing.JFrame.addImpl(JFrame.java:491) at java.awt.Container.add(Container.java:307) at timelabel.<init>(timelabel.java:31) at timelabel.main(timelabel.java:26) というエラーが出て何も表示されません どうしたらよろしいでしょうか。
お礼
freedom560さん、はじめまして。 まるで参考書のような丁寧な解説ありがとうございました。 おかげさまで、ラベルに今日の日付(日部分)を 表示させることができました。 一応、一通りjava参考書を読んだのですが 本に載ってなくて重要なことってたくさんありますね。 webの解説ページなどを読んでもっと、 プログラミングが上達するように頑張ります。
補足
ごめんなさい、 勘違いして、始めましてと書いてしまいました。 申し訳ございません