/*
* 課題2-4
* 課題2-2のデジタル時計で、属性をダイアログで指定できるようにしましたが、ダイアログを作りなおしてください。
* - レイアウトマネージャは、GridBagLayoutを使用する
* - プロパティダイアログは、属性名+のリストメニューが縦に並ぶようにする。
* - フォント フォントのリスト
* フォントサイズ サイズのリスト
* 文字色 色のリスト(色がわかるようにカラーチップも表示すること)
* 背景色 色のリスト
* この場合「属性名」のラベルは右寄せして、「値の選択リスト」メニューは左寄せる。
* - ダイアログの下には、「OK」「キャンセル」のボタンをダイアログの右下に寄せて表示し、それぞれのボタンを実装する。
* キャンセルされた場合には、正しく、元の値に戻るようにする。
* - java.util.prefsパッケージを使用して、プロパティダイアログの内容の保存と、時計の終了時の位置を保存する。
* 再度、時計を起動した場合に、それらの保存を復元して、デスクトップの元の位置に表示されるようにする。
*/
/*
* 課題2-2
* デジタル時計に次の機能追加を行なってください
* - メニューを付けて、プロパティダイアログを開ける
* - プロパティダイアログでは、以下の項目を設定できる
* 1. フォントの指定
* 2. フォントサイズの指定
* 3. 文字色の指定(色がわかるようにカラーチップも表示すること)
* 4. 時計の背景色の指定
* - フォントとフォントサイズを変更すると、時計を表示すべきフレームの大きさを適切に自動変更して、正しく表示されるようにする
*/
/*
* 課題2-1
* SwingのJFrameを使用して、時間を表示するデジタル時計(アナログ時計は不可)を作成してください。
* - javax.swing.JFrameを使用する
* - Windowsの普通のアプリケーションと同様にタイトルバーの「X」ボタンをクリックすると終了する。
* - デジタル時計の描画は、paintComponentメソッド内でGraphicsを使用して行う。テキストラベルによる単なる表示は、不可。
*/
package gui02_04;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.prefs.Preferences;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
public class DigitalClock extends JFrame implements Runnable, ActionListener
{
private static final long serialVersionUID = 1L;
private Thread th;
private DrawPanel drawPanel;
private DigitalClock me;
private Date currentDate;
private SimpleDateFormat simpleDataFormat = new SimpleDateFormat("HH:mm:ss");
private String fontType = "Times New Roman";
private int fontStyle = Font.PLAIN;
private Integer fontSize = 80;
private Color fontColor = Color.black;
private Font fontSetting = new Font(fontType, fontStyle, fontSize);
private Color backgroundColor = Color.white;
private PropertyDialog dialog;
private JMenu menuMenu;
private JMenuBar menuBar;
private JMenuItem menuProperty;
private Preferences prefs = Preferences.userNodeForPackage(this.getClass());
private int windowSizeX = prefs.getInt("miyahara_window_width", 80 * 8 + 50);
private int windowSizeY = prefs.getInt("miyahara_window_height", 80 + 50);
// Constructor
public DigitalClock()
{
// Set title
super("JDigitalClock");
// reference for this object to use inner class
me = this;
// To close window
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
// windowを閉じるときにパラメータを保存する
prefs.putInt("miyahara_window_x", (int)getBounds().getX());
prefs.putInt("miyahara_window_y", (int)getBounds().getY());
prefs.putInt("miyahara_window_width", (int)getBounds().getWidth());
prefs.putInt("miyahara_window_height", (int)getBounds().getHeight());
prefs.put("miyahara_font_type", fontType);
prefs.putInt("miyahara_font_size", fontSize);
prefs.put("miyahara_font_color", PropertyDialog.changeColorToString(fontColor));
prefs.put("miyahara_bg_color", PropertyDialog.changeColorToString(backgroundColor));
System.exit(0);
}
});
// Initialize
// Initialaize window
this.setSize(windowSizeX, windowSizeY);
this.setResizable(false);
this.setVisible(true);
// prefsからパラメータを読み込む
setBounds(prefs.getInt("miyahara_window_x", 500), prefs.getInt("miyahara_window_y", 100), prefs.getInt("miyahara_window_width", 80 * 8 + 50), prefs.getInt("miyahara_window_height", 80 + 50));
fontType = prefs.get("miyahara_font_type", "Times New Roman");
fontSize = prefs.getInt("miyahara_font_size", 80);
fontColor = PropertyDialog.changeStringToColor(prefs.get("miyahara_font_color", PropertyDialog.stringColor[3]));
backgroundColor = PropertyDialog.changeStringToColor(prefs.get("miyahara_bg_color", PropertyDialog.stringColor[0]));
// Initialize drawPanel
drawPanel = new DrawPanel();
this.add(drawPanel);
// Initialize time
currentDate = new Date();
// create menu bar
menuBar = new JMenuBar();
setJMenuBar(menuBar);
// [Menu]
menuMenu = new JMenu("Menu");
menuMenu.addActionListener(this);
menuBar.add(menuMenu);
// [Menu] - [Property]
menuProperty = new JMenuItem("Property...");
menuProperty.addActionListener(this);
menuMenu.add(menuProperty);
// create property dialog
dialog = new PropertyDialog(this);
}
@Override
public void run()
{
while (true)
{
drawPanel.repaint();
this.setSize(windowSizeX, windowSizeY);
try
{
Thread.sleep(1000);
}
catch (Exception e)
{
System.out.println("Error occurs at sleep: " + e);
}
}
}
public class DrawPanel extends JPanel
{
private static final long serialVersionUID = 1L;
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
// get current time
currentDate = new Date();
// set font setting
fontSetting = new Font(fontType, fontStyle, fontSize);
// set settings
g.setFont(fontSetting);
// ウィンドウサイズの計算
if (null != g)
{
windowSizeX = g.getFontMetrics().stringWidth(
simpleDataFormat.format(currentDate));
windowSizeX += me.getInsets().left;
windowSizeX += me.getInsets().right;
}
if (null != g)
{
// windowSizeY = g.getFontMetrics().getHeight();
windowSizeY = g.getFontMetrics().getMaxAscent(); // 最大の高さ
// windowSizeY = g.getFontMetrics().getAscent(); // 高さ。はみ出すかも。
windowSizeY += g.getFontMetrics().getDescent(); // ベースラインから下の深さ
// windowSizeY += g.getFontMetrics().getLeading(); // 行間
// windowSizeY *= 2; // キャプチャした時刻用
windowSizeY += me.getInsets().top;
windowSizeY += menuBar.getHeight();
}
// set background
g.setColor(backgroundColor);
g.fillRect(0, 0, windowSizeX, windowSizeY);
// draw date
g.setColor(fontColor);
g.drawString(simpleDataFormat.format(currentDate), 0, g.getFontMetrics().getMaxAscent());
// g.drawLine(0, g.getFontMetrics().getMaxAscent(), 100, g.getFontMetrics().getMaxAscent()); // base line
}
}
@Override
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == menuProperty)
{
// クリックしたのが「Property」だったら
dialog.resetParameter();
dialog.setVisible(true);
}
else
{
System.out.println("actionPerformed error");
}
}
public String getFontType()
{
return fontType;
}
public void setFontType(String fontType)
{
this.fontType = fontType;
}
public int getFontStyle()
{
return fontStyle;
}
public void setFontStyle(int fontStyle)
{
this.fontStyle = fontStyle;
}
public Integer getFontSize()
{
return fontSize;
}
public void setFontSize(Integer fontSize)
{
this.fontSize = fontSize;
}
public Color getFontColor()
{
return fontColor;
}
public void setFontColor(Color fontColor)
{
this.fontColor = fontColor;
}
public Color getBackgroundColor()
{
return backgroundColor;
}
public void setBackgroundColor(Color backgroundColor)
{
this.backgroundColor = backgroundColor;
}
/**
* @param args
*/
public static void main(String[] args)
{
DigitalClock window = new DigitalClock();
window.th = new Thread(window);
window.th.start(); // スレッドスタート
}
}