int nowHour = ...; SpinnerNumberModel hourModel = new SpinnerNumberModel(nowHow, 1, 12, 1); JSpinner hourSpinner = new JSpinner(hourModel); ... // minute second 与 hour 相似hourSpinner.addChangeListener(new ChangeListenr(){ public void stateChanged(ChangeEvent e){ ... // draw } });
获得的hourSpinner数据怎么与nowHour关联呢。
ChangerListener listener = new ChangeListener(){ public void stateChanged(ChangeEvent e){ int hour = ((Integer) hourSpinner.getValue()).intValue(); int minute = ((Integer) minuteSpinner.getVaule()).intValue(); int second = ((Integer) secondSpinner.getValue()).intValue(); drawClock(hour,minute,second); // 根据输入 的时、分、秒 绘制时钟 } } hourSpinner.addChangeListener(listener); minuteSpinner.addChangeListener(listener); secondSpinner.addChangeListener(listener);
发现一个简单的方法:http://www.java2s.com/Code/Java/Swing-JFC/Aspinnerofdates.htmDate today = new Date(); JSpinner s = new JSpinner(new SpinnerDateModel(today, null, null, Calendar.MONTH)); JSpinner.DateEditor de = new JSpinner.DateEditor(s, "hh:mm:ss"); s.setEditor(de);s.addChangeListener(new ChangeListener(){ public void stateChange(ChangeEvent e){ Date date = (Date)(s.getModel().getValue()); calender.setTime(date); hour=calender.get(Calendar.HOUR_OF_DAY); minute=calendar.get(Calendar.MINUTE); second=calendar.get(Calendar.SECOND); drawClock(hour,minute,second); } });
http://www.java2s.com/ 这个网站有大量Java Code Example
帮我看看哪里错了?不能更改时间。 //package Clock;import java.awt.*; import java.awt.event.*; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import javax.swing.*; import java.text.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener;public class Demo extends JApplet implements ActionListener,ChangeListener { private int hour,minute,second,x,y; private Calendar date,calender; private String label[]={"3","6","9","12"}; private Timer timer; private JSpinner spinner; private JTextField text; private JLabel infor; private JLabel ll = new JLabel(); private JPanel panel; Date today = new Date(); JSpinner s = new JSpinner(new SpinnerDateModel(today, null, null, Calendar.MONTH)); JSpinner.DateEditor de = new JSpinner.DateEditor(s, "H:mm");
s.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){ Date date = (Date)(s.getModel().getValue()); calender.setTime(date); hour=calender.get(Calendar.HOUR_OF_DAY); repaint(); } });
}
public void start() { if(timer==null) { timer = new Timer(1000,this); timer.start(); } else { if(!timer.isRunning()) timer.restart(); }
public void actionPerformed(ActionEvent e) { repaint(); } }
import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.util.Calendar; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit;import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.SpinnerDateModel; import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener;public class ClockExample extends JFrame { private ClockPanel clockPanel; private Date date = new Date(); private JSpinner dateSpinner; public ClockExample() { super("Analog Clock"); dateSpinner = new JSpinner(new SpinnerDateModel(date, null, null, Calendar.MONTH)); final JSpinner.DateEditor de = new JSpinner.DateEditor(dateSpinner, "hh:mm:ss"); dateSpinner.setEditor(de); final Container container = getContentPane(); clockPanel = new ClockPanel(); container.add(clockPanel, BorderLayout.CENTER); container.add(dateSpinner, BorderLayout.SOUTH); dateSpinner.addChangeListener(new ChangeListener() { public void stateChanged(final ChangeEvent e) { date = (Date) (dateSpinner.getModel().getValue()); clockPanel.setTime(date); } }); pack(); setDefaultCloseOperation(EXIT_ON_CLOSE); Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() { @Override public void run() { final long time = date.getTime(); date = new Date(time + 1000); clockPanel.setTime(date); } }, 1, 1, TimeUnit.SECONDS); setVisible(true); } public static void main(final String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new ClockExample(); } }); }}// //////////////////////////////////////////////////////////////Clock class class ClockPanel extends JPanel { private static final long serialVersionUID = 111111111111L; private static final double TWO_PI = 2.0 * Math.PI; private Calendar _now = Calendar.getInstance(); // Current time. private int _diameter; // Height and width of clock face private int _centerX; // x coord of middle of clock private int _centerY; // y coord of middle of clock private BufferedImage _clockImage; // Saved image of the clock face. // ==================================================== Clock constructor public ClockPanel() { setPreferredSize(new Dimension(300, 300)); } // =========================================================== updateTime void setTime(final Date date) { // ... Avoid creating new objects. _now.setTime(date); repaint(); } // ======================================================= paintComponent @Override public void paintComponent(final Graphics g) { final Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setStroke(new BasicStroke(2.f)); // ... The panel may have been resized, get current dimensions final int w = getWidth(); final int h = getHeight(); _diameter = ((w < h) ? w : h); _centerX = _diameter / 2; _centerY = _diameter / 2; // ... Create the clock face background image if this is the first time, // or if the size of the panel has changed if (_clockImage == null || _clockImage.getWidth() != w || _clockImage.getHeight() != h) { _clockImage = (BufferedImage) (this.createImage(w, h)); // ... Get a graphics context from this image final Graphics2D g2a = _clockImage.createGraphics(); g2a.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); drawClockFace(g2a); } // ... Draw the clock face from the precomputed image g2.drawImage(_clockImage, null, 0, 0); // ... Draw the clock hands dynamically each time. drawClockHands(g2); } // ====================================== convenience method drawClockHands private void drawClockHands(final Graphics2D g2) { // ... Get the various time elements from the Calendar object. final int hours = _now.get(Calendar.HOUR); final int minutes = _now.get(Calendar.MINUTE); final int seconds = _now.get(Calendar.SECOND); final int millis = _now.get(Calendar.MILLISECOND); // ... second hand int handMin = _diameter / 8; // Second hand doesn't start in middle. int handMax = _diameter / 2 - 20; // Second hand extends to outer rim. final double fseconds = (seconds + (double) millis / 1000) / 60.0; drawRadius(g2, fseconds, 0, handMax); // ... minute hand handMin = 0; // Minute hand starts in middle. handMax = _diameter / 3 - 5; final double fminutes = (minutes + fseconds) / 60.0; drawRadius(g2, fminutes, 0, handMax); // ... hour hand handMin = 0; handMax = _diameter / 4; drawRadius(g2, (hours + fminutes) / 12.0, 0, handMax); } // ======================================= convenience method drawClockFace private void drawClockFace(final Graphics2D g2) { // ... Draw the clock face. Probably into a buffer. g2.setColor(Color.PINK); g2.fillOval(0, 0, _diameter, _diameter); g2.setColor(Color.BLACK); g2.drawOval(0, 0, _diameter, _diameter); g2.fillOval(_centerX - 4, _centerY - 4, 8, 8); final int radius = _diameter / 2; // g2.drawString("12", 145, 25); // g2.drawString("6",150,275); // g2.drawString("9",25,146); // g2.drawString("3",275,146); // ... Draw the tick s around the circumference. for (int sec = 0; sec < 60; sec++) { int tickStart; if (sec % 5 == 0) { tickStart = radius - 10; // Draw long tick every 5. } else { tickStart = radius - 5; // Short tick . } drawRadius(g2, sec / 60.0, tickStart, radius); } } // ==================================== convenience method drawRadius // This draw lines along a radius from the clock face center. // By changing the parameters, it can be used to draw tick s, // as well as the hands. private void drawRadius(final Graphics2D g2, final double percent, final int minRadius, final int maxRadius) { // ... percent parameter is the fraction (0.0 - 1.0) of the way // clockwise from 12. Because the Graphics2D methods use radians // counterclockwise from 3, a little conversion is necessary. // It took a little experimentation to get this right. final double radians = (0.5 - percent) * TWO_PI; final double sine = Math.sin(radians); final double cosine = Math.cos(radians); final int dxmin = _centerX + (int) (minRadius * sine); final int dymin = _centerY + (int) (minRadius * cosine); final int dxmax = _centerX + (int) (maxRadius * sine); final int dymax = _centerY + (int) (maxRadius * cosine); g2.drawLine(dxmin, dymin, dxmax, dymax); } }
super("指针闹钟"); this.setSize(450,409); this.setLocation(420,200); clockPanel = new ClockPanel(); date = new Date(); sdf = new SimpleDateFormat("HH:mm:ss"); this.setVisible(true); this.setDefaultCloseOperation(EXIT_ON_CLOSE);
//初始化JSpinner组件 dateSpinner = new JSpinner(new SpinnerDateModel(date, null, null, Calendar.MONTH)); JSpinner.DateEditor de = new JSpinner.DateEditor(dateSpinner, "HH:mm:ss"); dateSpinner.setEditor(de);
//面板组件定义与初始化 Container container=getContentPane(); JPanel panel=new JPanel(); JLabel setnow = new JLabel("可以设置当前时间:"); final JLabel timelabel = new JLabel(); //当前时间的数字显示 final JLabel alarmlabel = new JLabel("当前无闹钟"); JButton ok = new JButton("确定修改"); JButton cancel = new JButton("取消闹钟");
SpinnerNumberModel hourModel = new SpinnerNumberModel(nowHow, 1, 12, 1);
JSpinner hourSpinner = new JSpinner(hourModel);
... // minute second 与 hour 相似hourSpinner.addChangeListener(new ChangeListenr(){
public void stateChanged(ChangeEvent e){
... // draw
}
});
public void stateChanged(ChangeEvent e){
int hour = ((Integer) hourSpinner.getValue()).intValue();
int minute = ((Integer) minuteSpinner.getVaule()).intValue();
int second = ((Integer) secondSpinner.getValue()).intValue(); drawClock(hour,minute,second); // 根据输入 的时、分、秒 绘制时钟
}
}
hourSpinner.addChangeListener(listener);
minuteSpinner.addChangeListener(listener);
secondSpinner.addChangeListener(listener);
JSpinner s = new JSpinner(new SpinnerDateModel(today, null, null, Calendar.MONTH));
JSpinner.DateEditor de = new JSpinner.DateEditor(s, "hh:mm:ss");
s.setEditor(de);s.addChangeListener(new ChangeListener(){
public void stateChange(ChangeEvent e){
Date date = (Date)(s.getModel().getValue());
calender.setTime(date);
hour=calender.get(Calendar.HOUR_OF_DAY);
minute=calendar.get(Calendar.MINUTE);
second=calendar.get(Calendar.SECOND);
drawClock(hour,minute,second);
}
});
//package Clock;import java.awt.*;
import java.awt.event.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.*;
import java.text.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;public class Demo extends JApplet implements ActionListener,ChangeListener
{
private int hour,minute,second,x,y;
private Calendar date,calender;
private String label[]={"3","6","9","12"};
private Timer timer;
private JSpinner spinner;
private JTextField text;
private JLabel infor;
private JLabel ll = new JLabel();
private JPanel panel;
Date today = new Date();
JSpinner s = new JSpinner(new SpinnerDateModel(today, null, null, Calendar.MONTH));
JSpinner.DateEditor de = new JSpinner.DateEditor(s, "H:mm");
public void init()
{
s.setEditor(de);
Container container=this.getContentPane();
container.setLayout(new BorderLayout());
panel=new JPanel();
panel.setLayout(new GridLayout(3,3,5,5));
setSize(500,309);
panel.add(s);
container.add(panel,BorderLayout.EAST);
s.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent e){
Date date = (Date)(s.getModel().getValue());
calender.setTime(date);
hour=calender.get(Calendar.HOUR_OF_DAY);
repaint();
}
});
}
public void start()
{
if(timer==null)
{
timer = new Timer(1000,this);
timer.start();
}
else
{
if(!timer.isRunning())
timer.restart();
}
}
public void paint(Graphics g)
{
super.paint(g);
date=Calendar.getInstance();
hour=date.get(Calendar.HOUR_OF_DAY);
minute=date.get(Calendar.MINUTE);
second=date.get(Calendar.SECOND);
g.setColor(Color.blue);
g.setFont(new Font("Dialog",Font.PLAIN,12));
g.drawArc(1,1,198,198,0,360);
g.drawArc(3,3,194,194,0,360);
g.drawString(label[0],187,104);
g.drawString(label[1],95,195);
g.drawString(label[2],5,104);
g.drawString(label[3],93,13);
for(int i=1;i<12;i++)
{
if(i%3!=0)
{
x=(int)(Math.sin(i*Math.PI/6)*94+100);
y=(int)(Math.cos(i*Math.PI/6)*94+100);
g.fillOval(x-2,y-2,5,5);
}
}
g.setColor(Color.black);
x=(int)(Math.sin(hour*Math.PI/6+minute*Math.PI/360)*70+100);
y=(int)(-Math.cos(hour*Math.PI/6+minute*Math.PI/360)*70+100);
g.drawLine(100,100,x,y);
g.drawLine(100-1,100-1,x,y);
g.drawLine(100-1,100,x,y);
g.drawLine(100-1,100+1,x,y);
g.drawLine(100,100+1,x,y);
g.drawLine(100+1,100+1,x,y);
g.drawLine(100+1,100,x,y);
g.drawLine(100+1,100-1,x,y);
g.drawLine(100,100-1,x,y);
x=(int)(Math.sin(minute*Math.PI/30)*80+100);
y=(int)(-Math.cos(minute*Math.PI/30)*80+100);
g.drawLine(100,100,x,y);
g.drawLine(100-1,100-1,x,y);
g.setColor(Color.black);
x=(int)(Math.sin(second*Math.PI/30)*90+100);
y=(int)(-Math.cos(second*Math.PI/30)*90+100);
g.drawLine(100,100,x,y);
}
public void actionPerformed(ActionEvent e)
{
repaint();
}
}
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerDateModel;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;public class ClockExample extends JFrame {
private ClockPanel clockPanel;
private Date date = new Date();
private JSpinner dateSpinner; public ClockExample() {
super("Analog Clock");
dateSpinner = new JSpinner(new SpinnerDateModel(date, null, null, Calendar.MONTH));
final JSpinner.DateEditor de = new JSpinner.DateEditor(dateSpinner, "hh:mm:ss");
dateSpinner.setEditor(de);
final Container container = getContentPane();
clockPanel = new ClockPanel();
container.add(clockPanel, BorderLayout.CENTER);
container.add(dateSpinner, BorderLayout.SOUTH); dateSpinner.addChangeListener(new ChangeListener() {
public void stateChanged(final ChangeEvent e) {
date = (Date) (dateSpinner.getModel().getValue());
clockPanel.setTime(date);
}
});
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
final long time = date.getTime();
date = new Date(time + 1000);
clockPanel.setTime(date);
}
}, 1, 1, TimeUnit.SECONDS);
setVisible(true);
} public static void main(final String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ClockExample();
}
});
}}// //////////////////////////////////////////////////////////////Clock class
class ClockPanel extends JPanel {
private static final long serialVersionUID = 111111111111L;
private static final double TWO_PI = 2.0 * Math.PI; private Calendar _now = Calendar.getInstance(); // Current time. private int _diameter; // Height and width of clock face
private int _centerX; // x coord of middle of clock
private int _centerY; // y coord of middle of clock
private BufferedImage _clockImage; // Saved image of the clock face. // ==================================================== Clock constructor
public ClockPanel() {
setPreferredSize(new Dimension(300, 300));
} // =========================================================== updateTime
void setTime(final Date date) {
// ... Avoid creating new objects.
_now.setTime(date);
repaint();
} // ======================================================= paintComponent
@Override
public void paintComponent(final Graphics g) {
final Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setStroke(new BasicStroke(2.f));
// ... The panel may have been resized, get current dimensions
final int w = getWidth();
final int h = getHeight();
_diameter = ((w < h) ? w : h);
_centerX = _diameter / 2;
_centerY = _diameter / 2; // ... Create the clock face background image if this is the first time,
// or if the size of the panel has changed
if (_clockImage == null || _clockImage.getWidth() != w || _clockImage.getHeight() != h) {
_clockImage = (BufferedImage) (this.createImage(w, h)); // ... Get a graphics context from this image
final Graphics2D g2a = _clockImage.createGraphics();
g2a.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
drawClockFace(g2a);
} // ... Draw the clock face from the precomputed image
g2.drawImage(_clockImage, null, 0, 0); // ... Draw the clock hands dynamically each time.
drawClockHands(g2);
} // ====================================== convenience method drawClockHands
private void drawClockHands(final Graphics2D g2) {
// ... Get the various time elements from the Calendar object.
final int hours = _now.get(Calendar.HOUR);
final int minutes = _now.get(Calendar.MINUTE);
final int seconds = _now.get(Calendar.SECOND);
final int millis = _now.get(Calendar.MILLISECOND); // ... second hand
int handMin = _diameter / 8; // Second hand doesn't start in middle.
int handMax = _diameter / 2 - 20; // Second hand extends to outer rim.
final double fseconds = (seconds + (double) millis / 1000) / 60.0;
drawRadius(g2, fseconds, 0, handMax); // ... minute hand
handMin = 0; // Minute hand starts in middle.
handMax = _diameter / 3 - 5;
final double fminutes = (minutes + fseconds) / 60.0;
drawRadius(g2, fminutes, 0, handMax); // ... hour hand
handMin = 0;
handMax = _diameter / 4;
drawRadius(g2, (hours + fminutes) / 12.0, 0, handMax);
} // ======================================= convenience method drawClockFace
private void drawClockFace(final Graphics2D g2) {
// ... Draw the clock face. Probably into a buffer.
g2.setColor(Color.PINK);
g2.fillOval(0, 0, _diameter, _diameter);
g2.setColor(Color.BLACK);
g2.drawOval(0, 0, _diameter, _diameter);
g2.fillOval(_centerX - 4, _centerY - 4, 8, 8); final int radius = _diameter / 2; // g2.drawString("12", 145, 25);
// g2.drawString("6",150,275);
// g2.drawString("9",25,146);
// g2.drawString("3",275,146); // ... Draw the tick s around the circumference.
for (int sec = 0; sec < 60; sec++) {
int tickStart;
if (sec % 5 == 0) {
tickStart = radius - 10; // Draw long tick every 5.
} else {
tickStart = radius - 5; // Short tick .
}
drawRadius(g2, sec / 60.0, tickStart, radius);
}
} // ==================================== convenience method drawRadius
// This draw lines along a radius from the clock face center.
// By changing the parameters, it can be used to draw tick s,
// as well as the hands.
private void drawRadius(final Graphics2D g2, final double percent, final int minRadius, final int maxRadius) {
// ... percent parameter is the fraction (0.0 - 1.0) of the way
// clockwise from 12. Because the Graphics2D methods use radians
// counterclockwise from 3, a little conversion is necessary.
// It took a little experimentation to get this right.
final double radians = (0.5 - percent) * TWO_PI;
final double sine = Math.sin(radians);
final double cosine = Math.cos(radians); final int dxmin = _centerX + (int) (minRadius * sine);
final int dymin = _centerY + (int) (minRadius * cosine); final int dxmax = _centerX + (int) (maxRadius * sine);
final int dymax = _centerY + (int) (maxRadius * cosine);
g2.drawLine(dxmin, dymin, dxmax, dymax);
}
}
上面那段代码绘制钟表那段就是从别人那里修改来的。原来的是一个和系统同步的时钟,被我修改成只绘制传入时间点了。
麻烦你了。
这行的意思是,每隔一秒重新绘制新传入的时间点。Java 只有某段时间后做某事,没有某个时间点做某事的 方法。
ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(1);
Runnable alarmTask = ...
使用 scheduler.schedule(alarmTask, delay, TimeUnit.SECONDS)delay * TimeUnit.SECONDS 是你要做的事与现在的时间间隔。具体你去看这几个类的javadoc
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
import java.util.concurrent.*;
import java.text.SimpleDateFormat;
import java.applet.AudioClip;
import java.net.URL;
@SuppressWarnings("serial")
public class AlarmClock extends JFrame{
/**
* Author:SETORAN
* Date:2010年1月11日
*/
private ClockPanel clockPanel; //时钟面板
private Date date; //保存钟表时间
private JSpinner dateSpinner; //微调组件
private SimpleDateFormat sdf; //时间格式
private String alarmstr; //保存闹钟时刻
private int alarmflag; //闹钟标志
public AlarmClock() {
super("指针闹钟");
this.setSize(450,409);
this.setLocation(420,200);
clockPanel = new ClockPanel();
date = new Date();
sdf = new SimpleDateFormat("HH:mm:ss");
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
//初始化JSpinner组件
dateSpinner = new JSpinner(new SpinnerDateModel(date, null, null, Calendar.MONTH));
JSpinner.DateEditor de = new JSpinner.DateEditor(dateSpinner, "HH:mm:ss");
dateSpinner.setEditor(de);
//面板组件定义与初始化
Container container=getContentPane();
JPanel panel=new JPanel();
JLabel setnow = new JLabel("可以设置当前时间:");
final JLabel timelabel = new JLabel(); //当前时间的数字显示
final JLabel alarmlabel = new JLabel("当前无闹钟");
JButton ok = new JButton("确定修改");
JButton cancel = new JButton("取消闹钟");
//菜单栏定义与初始化
JMenuBar mainmenubar=new JMenuBar();
JMenu alarmenu=new JMenu("设置闹钟(F)");
alarmenu.setMnemonic(KeyEvent.VK_F);
JMenuItem item1 = new JMenuItem("设置闹钟时间");
JMenuItem item2 = new JMenuItem("关于作者");
alarmenu.add(item1);
alarmenu.add(item2);
mainmenubar.add(alarmenu);
panel.add(mainmenubar);
//****************************界面布局与调整*****************************************
//添加组件
container.setLayout(null);
container.add(panel);
container.add(timelabel);
container.add(clockPanel);
container.add(setnow);
container.add(dateSpinner);
container.add(ok);
container.add(alarmlabel);
container.add(cancel);
//组件大小
panel.setSize(500,25);
timelabel.setSize(200,20);
clockPanel.setSize(220,220);
setnow.setSize(250,30);
dateSpinner.setSize(150,30);
ok.setSize(100,30);
alarmlabel.setSize(270, 30);
cancel.setSize(100, 30);
//组件位置
panel.setLocation(-200, 0);
timelabel.setLocation(45,40);
clockPanel.setLocation(50,70);
setnow.setLocation(45, 330);
dateSpinner.setLocation(160,330);
ok.setLocation(340,330);
alarmlabel.setLocation(45,290);
cancel.setLocation(340,290);
timelabel.setForeground(Color.RED);
alarmlabel.setForeground(Color.red);
//************************************************************************************
//“设置闹钟时间”的菜单项监听
item1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
setAlarmTime();
}
});
//“关于作者”的菜单项监听
item2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
JOptionPane.showMessageDialog(null, "SETORAN!");
}
});
//JSpinner组件的监听
dateSpinner.addChangeListener(new ChangeListener() {
public void stateChanged(final ChangeEvent e) {
date = (Date) (dateSpinner.getModel().getValue());
clockPanel.setTimed(date);
}
});
//“确定”键的监听
ok.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
date = (Date) (dateSpinner.getModel().getValue());
clockPanel.setTimed(date); }
});
//“取消”键的监听
cancel.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
alarmlabel.setText("当前无闹钟");
alarmflag=0;
alarmstr="mbb";
}
}); //线程管理
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
public void run() {
long time = date.getTime();
date = new Date(time + 1000); //时间加一秒
//当钟表时间和闹钟时刻相等时,执行闹铃和提示
if(sdf.format(date).equals(alarmstr)){
URL file = getClass().getResource("MBB.wav");
AudioClip sound = java.applet.Applet.newAudioClip(file);
sound.loop();
JOptionPane.showMessageDialog(null, "时间到了,没饭吃啦!!!");
alarmlabel.setText("当前无闹钟");
alarmflag=0;
alarmstr="mbb"; //取消闹钟的标志
sound.stop();
}
if(alarmflag==819043088){
alarmlabel.setText("闹钟时刻是:"+alarmstr);
}
clockPanel.setTimed(date); //重画时钟
timelabel.setText("当前时间是:"+sdf.format(date));
}
}, 1, 1, TimeUnit.SECONDS);
}
//设置闹钟时刻的方法
public void setAlarmTime()
{
do{
alarmstr = JOptionPane.showInputDialog(this, "请输入闹钟时刻:",sdf.format(date));
}while(alarmstr.length()!=8);
alarmflag=819043088; //设置闹钟标志 }
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() { //Swing是线程不安全的,SwingUtilities.invokeLater和invokeAndWait允许事件派发线程调用另一个线程中的任意一个代码块
public void run() {
new AlarmClock();
}
});
}
}//绘制时钟的panel类
class ClockPanel extends JPanel {
private int hour,minute,second,x,y;
private Calendar now=Calendar.getInstance();
private String label[]={"3","6","9","12"};
public ClockPanel() {
this.setBackground(Color.white);
} void setTimed(Date date) {
now.setTime(date);
repaint();
}
public void paint(Graphics g){
super.paint(g);
hour=now.get(Calendar.HOUR_OF_DAY);
minute=now.get(Calendar.MINUTE);
second=now.get(Calendar.SECOND);
//绘制表盘
g.setColor(Color.blue);
g.setFont(new Font("Dialog",Font.PLAIN,12));
g.drawArc(1,1,198,198,0,360);
g.drawArc(3,3,194,194,0,360);
g.drawString(label[0],187,104);
g.drawString(label[1],95,195);
g.drawString(label[2],5,104);
g.drawString(label[3],93,13);
for(int i=1;i<12;i++)
{
if(i%3!=0)
{
x=(int)(Math.sin(i*Math.PI/6)*94+100);
y=(int)(Math.cos(i*Math.PI/6)*94+100);
g.fillOval(x-2,y-2,5,5);
}
}
//绘制红色时针
g.setColor(Color.RED);
x=(int)(Math.sin(hour*Math.PI/6+minute*Math.PI/360)*50+100);
y=(int)(-Math.cos(hour*Math.PI/6+minute*Math.PI/360)*50+100);
g.drawLine(100,100,x,y);
g.drawLine(100-1,100-1,x,y);
g.drawLine(100-1,100,x,y);
g.drawLine(100-1,100+1,x,y);
g.drawLine(100,100+1,x,y);
g.drawLine(100+1,100+1,x,y);
g.drawLine(100+1,100,x,y);
g.drawLine(100+1,100-1,x,y);
g.drawLine(100,100-1,x,y);
//绘制红色分针
x=(int)(Math.sin(minute*Math.PI/30)*80+100);
y=(int)(-Math.cos(minute*Math.PI/30)*80+100);
g.drawLine(100,100,x,y);
g.drawLine(100-1,100-1,x,y);
//绘制黑色秒针
g.setColor(Color.black);
x=(int)(Math.sin(second*Math.PI/30)*90+100);
y=(int)(-Math.cos(second*Math.PI/30)*90+100);
g.drawLine(100,100,x,y);
}
}这是最后的代码,功能都实现了,有什么问题请指正,谢谢啦
2.闹钟时间到后,弹出提示比停止时钟更好一些。ps. 时钟停走后没发现怎么让他继续走下去