使用3个JSpinner分别收集时、分、秒。

解决方案 »

  1.   

    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
        } 
    });
      

  2.   

    获得的hourSpinner数据怎么与nowHour关联呢。
      

  3.   

    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);
      

  4.   

    发现一个简单的方法: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);
        }
    });
      

  5.   

    http://www.java2s.com/ 这个网站有大量Java Code Example
      

  6.   

    帮我看看哪里错了?不能更改时间。
    //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();
    }
    }
      

  7.   

    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);
        }
    }
      

  8.   

    Jspinner  什么东东。。 友情顶下。
      

  9.   

    我那代码有点乱,我说一下我的问题:就是每次调用paint()时,date要怎么设置,本来是去系统时间的,所以时钟可以走,但是如果取Jspinner的数据就每次都一样了,到底要怎么设置呢?
      

  10.   

    你还是看一下我贴的吧。你的那个程序还是AWT时代的写法,没有进入Swing时代。
      

  11.   

    好的,你的代码果然很好,不过那个paint()方法我还是用了原来的那个。你用的2D我不熟悉。我做的作业是闹钟,等我做完,你帮忙提一点意见,呵呵,谢谢啊。
      

  12.   

    我要做闹钟,那要在哪里判断时钟时刻和闹钟时刻相等?在paint()里还是Excutors对象这边?
      

  13.   

    在paint外,在我看来,paint只处理绘制传入的某个时间点。其他的逻辑在别处处理。
      

  14.   

    有万能的Google和baidu,看看别人怎么写,照着来。
    上面那段代码绘制钟表那段就是从别人那里修改来的。原来的是一个和系统同步的时钟,被我修改成只绘制传入时间点了。
      

  15.   

    那个Executors.newScheduledThreadPool(1).scheduleAtFixedRate  我不太懂,闹钟是不是在里面设置?
    麻烦你了。
      

  16.   

    Executors.newScheduledThreadPool(1).scheduleAtFixedRate(...)
    这行的意思是,每隔一秒重新绘制新传入的时间点。Java 只有某段时间后做某事,没有某个时间点做某事的 方法。
    ScheduledExecutorService scheduler = 
           Executors.newScheduledThreadPool(1);
    Runnable alarmTask = ...
    使用 scheduler.schedule(alarmTask, delay, TimeUnit.SECONDS)delay * TimeUnit.SECONDS 是你要做的事与现在的时间间隔。具体你去看这几个类的javadoc
      

  17.   

    题目4:编写时钟程序,要求画出时钟面板,时针,分针,秒针,可设定或解除闹钟时间,并提供闹钟服务相应的文字提示功能与声音提示功能。
    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);
    }
    }这是最后的代码,功能都实现了,有什么问题请指正,谢谢啦
      

  18.   

    1.绘制时钟那里。Swing编程 一般是重写 paintComponent(Graphics g) 而不是 paint(Graphics g)。要启用抗锯齿,否则秒针太难看了。
    2.闹钟时间到后,弹出提示比停止时钟更好一些。ps. 时钟停走后没发现怎么让他继续走下去