编写一个窗口程序完成一个模拟钟表和一个数字钟表,并可以通过菜单进行切换。
设计要求:
1)界面要求有创意;
2)最好钟表在正点具有音乐报时功能;
3)钟表具有设置时间的功能;
作者:方贵深
吉林大学珠海学院
注 意 : 这 里 的 闹 钟 报 时 功 能 会 用 到 音 频 文 件 , 音 频 我 已 经 共 享 到 百 度 网 盘 :
http://pan.baidu.com/share/link?shareid=316565&uk=2164473602
将文件解压到工程的根目录里即可。
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import javax.swing.JFrame;
import sun.audio.AudioPlayer;
/**
*
* @author Administrator
*/
class ModifyTime
{
public static int[] time = new int[3];
public static boolean mark = false;
public int[] showModifyDialog(JFrame frame, boolean modal) {
MyJDialog dialog = new MyJDialog(frame, true);
dialog.setVisible(true);
if (mark) {
mark = false;
return time;
}
return null;
}
private class MyJDialog extends javax.swing.JDialog
{
MyKeyListener myKeyListener=new MyKeyListener();
/**
* Creates new form MyJDialog
*/
public MyJDialog(javax.swing.JFrame parent, boolean modal)
{
super(parent, "修改时间", modal);
Container container = this.getContentPane();
initComponents();
jTextField1.addKeyListener(myKeyListener);
jTextField2.addKeyListener(myKeyListener);
jTextField3.addKeyListener(myKeyListener);
container.addKeyListener(myKeyListener);
jPanel2.addKeyListener(myKeyListener);
}
private class MyKeyListener extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
if (e.getKeyChar() == KeyEvent.VK_ENTER) {
okButton.doClick();
}
}
}
@SuppressWarnings("unchecked")
//
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jSeparator1 = new javax.swing.JSeparator();
jPanel2 = new javax.swing.JPanel();
jTextField1 = new javax.swing.JTextField();
jTextField2 = new javax.swing.JTextField();
jTextField3 = new javax.swing.JTextField();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
okButton = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
jLabel1.setText("设置时间");
jSeparator1.setBorder(javax.swing.BorderFactory.createLineBorder(new
java.awt.Color(0,
0,
0)));
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap(27, Short.MAX_VALUE)
.addComponent(jLabel1)
.addGap(18, 18, 18)
.addComponent(jSeparator1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)));
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(22, 22, 22)
.addComponent(jLabel1)
.addContainerGap())
.addComponent(jSeparator1, javax.swing.GroupLayout.Alignment.TRAILING));
jTextField3.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTextField3ActionPerformed(evt);
}
});
jLabel2.setText(":");
jLabel3.setText(":");
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addGap(36, 36, 36)
.addComponent(jTextField1,
javax.swing.GroupLayout.PREFERRED_SIZE,
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jTextField2,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
javax.swing.GroupLayout.PREFERRED_SIZE)
60,
60,
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(jLabel3,
javax.swing.GroupLayout.PREFERRED_SIZE)
javax.swing.GroupLayout.PREFERRED_SIZE,
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jTextField3,
javax.swing.GroupLayout.PREFERRED_SIZE,
6,
60,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(36, 36, 36)));
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createSequentialGroup()
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
.addContainerGap(20, Short.MAX_VALUE)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELI
NE)
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jTextField1,
.addComponent(jTextField2,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jTextField3,
javax.swing.GroupLayout.PREFERRED_SIZE,
.addComponent(jLabel2)
.addComponent(jLabel3))
.addGap(19, 19, 19)));
okButton.setText("确定");
okButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jPanel1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(18, 18, 18)
.addComponent(jPanel2,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
.addGroup(layout.createSequentialGroup()
.addGap(123, 123, 123)
.addComponent(okButton)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))));
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel1,
.addContainerGap())
.addGroup(layout.createSequentialGroup()
.addComponent(jPanel2,
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
39,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)
.addComponent(okButton)
.addGap(29, 29, 29)));
pack();
}//
private void jTextField3ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
mark = true;
String h = jTextField1.getText();
String m = jTextField2.getText();
String s = jTextField3.getText();
ModifyTime.time[0] = Integer.parseInt(h);
ModifyTime.time[1] = Integer.parseInt(m);
ModifyTime.time[2] = Integer.parseInt(s);
this.dispose();
}
/**
* @param args the command line arguments
*/
/**
* @param args the command line arguments
*/
// Variables declaration - do not modify
private javax.swing.JButton okButton;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JTextField jTextField3;
// End of variables declaration
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JTextField jTextField3;
}
public class Timekeeper extends javax.swing.JFrame
{
private Toolkit tk = getToolkit();
private boolean drawing=true;
private GregorianCalendar c = null;
private int radius = 120;
private boolean synchronism = true;
private boolean digital = false;
// 定义时间变量
private int dayOfWeek;
private int year;
private int month;
private int day;
private int hours;
private int minutes;
private int second;
SimpleDateFormat dateFormat1;
SimpleDateFormat dateFormat2;
Point point1 = null; // 原点
Point point2 = null; // 终点
int n = 1;
int[] time = new int[3];
MyThreadDigit mtd = null;
MyThreadAnalog mta = null;
// 构造函数
public Timekeeper()
{
super("时钟");
initComponents();
dateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat2 = new SimpleDateFormat("yyyy年MM月dd日 E");
this.setResizable(false);
buttonModify.setEnabled(false);
this.addWindowListener(new WindowAdapter()
{
public void windowIconified(WindowEvent e)
{
drawing=false;
}
public void windowDeiconified(WindowEvent e)
{
drawing=true;
repaint();
}
});
if (digital)
{
mtd = new MyThreadDigit(this);
mtd.start();
mta = new MyThreadAnalog(this);
mta.start();
} else
{
}
}
public void playMusic(int n)
{
play(n);
}
public void play(int n)
{
InputStream inputStream=null;
try
{
inputStream = new FileInputStream(new File(String.valueOf(n).trim()+".wav"));// file
// 指的是音乐的路径。
AudioPlayer.player.start(inputStream);
Thread.sleep(15000);
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
}
}
if(inputStream!=null)
inputStream.close();
} catch (Exception e2)
{
// TODO: handle exception
}
// 新建一个数字时钟线程
private class MyThreadDigit extends Thread
{
private JFrame jFrame;
public MyThreadDigit(JFrame jFrame)
{
this.jFrame = jFrame;
}
public void run()
{
try
{
for (;;)
{
timeWork();
if (synchronism)
{
String string = dateFormat1.format(c.getTime());
String[] strs = string.split(" ");
label_date.setText(strs[0]);
label_time.setText(strs[1]);
}
Thread.sleep(1000);
}
} catch (Exception e)
{
}
}
}
// 新建一个模拟时钟线程
private class MyThreadAnalog extends Thread
{
private JFrame jFrame;
public MyThreadAnalog(JFrame jFrame)
{
this.jFrame = jFrame;
}
public void run()
{