加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 在间隔后重新绘制Swing JComponent

发布时间:2020-12-15 08:43:47 所属栏目:Java 来源:网络整理
导读:我被分配了一个项目,我必须使用 java中的GregorianCalendar对象制作模拟时钟.首先,我们被告知让时钟工作,以便在每次运行时显示正确的时间.然后我们被告知要在每秒运行时重绘时钟.我创建了一个计时器对象,并认为我可以添加一个ActionListener并在每次调用acti
我被分配了一个项目,我必须使用 java中的GregorianCalendar对象制作模拟时钟.首先,我们被告知让时钟工作,以便在每次运行时显示正确的时间.然后我们被告知要在每秒运行时重绘时钟.我创建了一个计时器对象,并认为我可以添加一个ActionListener并在每次调用actionPerformed时重新绘制它,但显然不能以这种方式使用重绘.这是我的代码:

import javax.swing.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.awt.*;
    import java.util.Calendar;
    import java.util.GregorianCalendar;
    import java.util.Date;
    import javax.swing.Timer;
    import java.lang.Math;    

    public class SwingClock {

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                MyFrame frame = new MyFrame();
                frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
                ActionListener listener = new TimePrinter();
                Timer t = new Timer(1000,listener);
                GregorianCalendar calendar = new GregorianCalendar();
                t.start();
                frame.setVisible(true);
            }
        });
    }
}

    class TimePrinter implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            //I'd like to repaint here every second,but I can't
        }
    }

    class MyFrame extends JFrame
    {
        public MyFrame()
        {
            setTitle("Swing Clock");
            setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);

            MyComponent component = new MyComponent();
            add(component);
        }

        public static final int DEFAULT_WIDTH = 500;
        public static final int DEFAULT_HEIGHT = 500;
    }

    class MyComponent extends JComponent
    {
        public void paint(Graphics g)
        {
            Graphics2D g2 = (Graphics2D)g;
            int leftX = 50,topY = 50,width = 300,height = 300;
            Rectangle2D rect = new Rectangle2D.Double(leftX,topY,width,height);

            Ellipse2D clockFace = new Ellipse2D.Double();
            clockFace.setFrame(rect);
            g2.draw(clockFace);

            double centerX = clockFace.getCenterX();
            double centerY = clockFace.getCenterY();
            GregorianCalendar calendar = new GregorianCalendar();
            int hour = calendar.get(Calendar.HOUR_OF_DAY);

            int minute = calendar.get(Calendar.MINUTE);
            int second = calendar.get(Calendar.SECOND);

            double minusMinute = (90 - (minute*6))*(Math.PI/180);           
            double minuteCosine = Math.cos(minusMinute);
            double minuteSine = Math.sin(minusMinute);

            double minusSecond = (90 - (second*6))*(Math.PI/180);
            double secondCosine = Math.cos(minusSecond);
            double secondSine = Math.sin(minusSecond);

            double hourTheta = (90-(hour+(minute/60)*30))*(Math.PI/180);
            g2.draw(new Line2D.Double(centerX,centerY,centerX+50*(Math.cos(hourTheta)),centerY - 50*(Math.sin(hourTheta))));   
            g2.draw(new Line2D.Double(centerX,centerX+150*(minuteCosine),centerY-150*(minuteSine)));
        g2.draw(new Line2D.Double(centerX,centerX+100*secondCosine,centerY-100*(secondSine)));
        }
    }

关于如何解决这个问题的任何想法?也许我错了?

解决方法

“Swing程序 should override paintComponent()而不是覆盖paint(),”虽然你会看到,这根本不是必需的.其次,你使用 javax.swing.Timer是正确的.第三,为什么不让自己轻松自如并使用JLabel实例显示时间呢?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读