Home > Archives > 2009-02
2009-02
Java, JSP: 現在時刻が指定期間内か判定する - GregorianCalendar#before、after
- 2009-02-23 (月)
- Java
日時を扱うクラスはDateとGregorianCalendarがありますが、Sunは後者を推奨しているようです。実際GregorianCalendarのほうが扱いやすいです。下のサンプルは、現在時刻が指定した期間内か否かを判定するものです。
ソースコード
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="java.util.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<%!
final int MONTH_OFFSET = 1;
String showTime(Calendar cal) {
String str;
str = cal.get(Calendar.YEAR) + "/"
+ (cal.get(Calendar.MONTH) + MONTH_OFFSET) + "/"
+ cal.get(Calendar.DATE) + " "
+ cal.get(Calendar.HOUR) + ":"
+ cal.get(Calendar.MINUTE);
return str;
}
boolean isPeriod(Calendar start, Calendar end) {
Calendar cur = Calendar.getInstance();
return cur.after(start) && cur.before(end);
}
%>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Date Comparison</title>
</head>
<body>
<h1>JSP Date Comparison</h1>
<%
// (year, month, date, hour, minute) monthの範囲は0-11で1月は0
Calendar startTime = new GregorianCalendar(2009, 2 - MONTH_OFFSET, 23, 21, 0);
Calendar endTime = new GregorianCalendar(2009, 2 - MONTH_OFFSET, 23, 21, 10);
out.println("開始時刻: " + showTime(startTime) + "<br />");
out.println("終了時刻: " + showTime(endTime) + "<br />");
if (isPeriod(startTime, endTime)) {
out.println("現時刻は指定期間「内」");
} else {
out.println("現時刻は指定期間「外」");
}
%>
</body>
</html>
日時の比較はGregorianCalendar#after、beforeメソッド以外にint compareTo(Calendar cal)等もあります。
実際に使う際、期間を指定するGregorianCalendarのコンストラクタの引数データは他の入力から受け取るようにします。
実行結果例
本日の21:05に計ると…
JSP Date Comparison 開始時刻: 2009/2/23 9:0 終了時刻: 2009/2/23 9:10 現時刻は指定期間「内」
追記: SimpleDateFormatによる出力の整形
d_kamiさんに改良していただきました。ありがとうございます(^-^)
String showTime(Calendar cal) {
Date date = cal.getTime();
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm");
return format.format(date);
}
と書けばすっきりするよ、import java.text.SimpleDateFormatを忘れずに - SimpleDateFormat - マイペースなプログラミング日記
showTimeを修正して計りなおした実行結果は、
開始時刻: 2009/02/23 21:00 終了時刻: 2009/02/24 21:10 現時刻は指定期間「内」
確かに出力はyyyy/MM/dd HH:mmの形式になっていて見栄えも良いです。
参考サイト
- Comments: 0
- Trackbacks: 1
Java, Swing: JComponentのGraphicsオブジェクトを用いて直線を描画
- 2009-02-21 (土)
- Java
JComponentはほとんど全てのSwing コンポーネントの基底クラスで、Graphicsオブジェクトも持っています。下記のソースは、そのGraphicsを用いて画面に直線を描画するものです。
ソースコード
package linecomp;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Insets;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class LineComp extends JComponent {
public static void main(String[] args) {
Runnable myGUI = new Runnable() {
@Override
public void run() {
JFrame win = new JFrame("Line Component");
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Insets ins = win.getInsets();
win.setSize(300 + ins.left + ins.right, 300 + ins.top + ins.bottom);
win.add(new LineComp());
win.setVisible(true);
}
};
SwingUtilities.invokeLater(myGUI); // 保留中のすべての AWT イベントが処理されたあとに発生
}
@Override
public void paintComponent(Graphics g) {
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.RED);
g.drawLine(0, 0, getWidth(), getHeight());
}
}
GUI部品の(再)描画レンダリングが発生した際、オーバーライドしたpaintComponent()内の手続きをEventQueueに登録しEDT(Event Dispatch Thread)が処理をします。標準のGUI部品をカスタマイズしたい場合などに使えます。その場合は予めsuper.paintComponent(g);でデフォルトのレンダリングを基底クラスに任せ、その後にカスタムの描画処理を書きます。
実行結果

追記: d_kami さんに改良して頂きました
InsetとJFrame#setSizeを使わずにJComponent#setPreferredSizeとJFrame#packを使うようにした - 他のやり方 - マイペースなプログラミング日記
comp.setPreferredSize(new Dimension(300, 300)); win.add(comp); win.pack();
確かにsetPreferredSizeでコンポーネントのサイズを直接指定したほうが今プログラムの文脈に沿っています。私のほうはコンポーネントでなくJFrameのサイズの指定ですから。また、オーバーライドしたpaintComponent()でgetWidth()やgetHeight()を二度使うのであれば、一度ローカル変数に格納することでオーバヘッドを下げるのも大切ですね。日頃からの習慣にしないと。
とても勉強になりました。ありがとうございます。
参考サイト
- Comments: 0
- Trackbacks: 1
NetBeans から Subversion でコミットをする際のエラーの解決法の一例
- 2009-02-12 (木)
- 開発環境
Windows版NetBeans6.5でソースをインポートまたはコミットする際に以下のようなエラーが発生する場合があります。
'.' is not a working copy Can't open file '.svn/entries': No such file or directory
これはNetBeansが使用するsvnクライアントがcygwinのものだった場合に生じるエラーのようです。
未だcygwin環境のsvn以外のsvnをインストールしていない場合は下のアドレスからダウンロードしてください。
subversion: Subversion Packages
その後、メニューバーの「ツール」→「オプション」から設定画面を開いて、「その他」タブ→「バージョン管理」画面のSubversion画面を開きます。左にあるリストメニューからSubversionを選択し、最初の設定項目である「SVN実行可能ファイルパス」を設定すれば正常にインポート、コミットできるようになります。
ちなみに、cygwinのでなければ↑のsvnパッケージでなくともOKのようです。
参考サイト
- Comments: 0
- Trackbacks: 0
Home > Archives > 2009-02