`
zeyuphoenix
  • 浏览: 55537 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java的简单数字时钟

 
阅读更多
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="ProgId" content="Word.Document"> <meta name="Generator" content="Microsoft Word 12"> <meta name="Originator" content="Microsoft Word 12"> <link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"> <link rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_editdata.mso"> <!--[if !mso]> <style> v":* {behavior:url(#default#VML);} o":* {behavior:url(#default#VML);} w":* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><link rel="themeData" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"> <link rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"> <!--[if gte mso 9]><xml> Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 </xml><![endif]--><!--[if gte mso 9]><![endif]--><style> <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4;} @font-face {font-family:Calibri; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-alt:"Times New Roman";} @font-face {font-family:""@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal { mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Calibri","serif"; mso-bidi-font-family:"Times New Roman";} .MsoChpDefault { font-size:10.0pt;} /* Page Definitions */ @page {} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; layout-grid:15.6pt;} div.Section1 {page:Section1;} --> </style> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.5pt; font-family:"Calibri","serif"; mso-bidi-font-family:"Times New Roman";} </style> <![endif]-->

Java的简单数字时钟

这里是最简单的实现方法,大概思路就是在一个JComponent上每隔一段时间进行一次重绘,为了保证重绘Timer的执行时间和终了时间,重写JComponentaddNotify方法和removeNotify方法,最后在DigitalClockUI中重写paint方法来绘制界面,并且重写 getPreferredSize使绘制的内容自适应界面的大小.

先看看效果:



<!--[if gte vml 1]> <![endif]-->

<!--[if gte vml 1]> <![endif]-->

基本的工程目录如下:

<!--[if gte vml 1]> <![endif]-->

首先是最基本的界面: Clock,在这个工程里,这个类作用很小,定义不定义其实都无所谓,这儿定义它主要是为了统一,为以后实现其它时钟提供方便

这儿把它定义成抽象的

/**

 * This bean to define basic properties and behaviors of a clock, concrete

 * instances will be implemented by <code>DigitalClock</code> and others.

 */

publicabstractclass Clock extends JComponent {

为它提供几个属性:

    /**

     * The calendar instance for this clock.

     */

    private Calendar calendar;

    /**

     * Background image of the clock.

     */

    private Image bgImage;

    /**

     * Font rendering context - assumes no default transform, anti-aliasing

     * active and fractional metrics allowed.

     */

publicstaticfinal FontRenderContext frc = new FontRenderContext(null, true, true);

其中FontRenderContext提供了文本显示和绘制的信息容器.

在构造函数中把calendar初始化:

    calendar = Calendar.getInstance();

接着看DigitalClock,这个类继承Clock,主要是提供时钟计时Timer启动和终止的,另外提供了数字时钟的页面分隔符信息,以及UI设置和取得.

首先是定义的属性:

    /**

     * divide time.

     */

    private String padding1 = "";

    private String padding2 = "";

分别代表时分秒之间的分隔和秒与毫秒之间的分隔.

接着是构造函数,提供基本的和带参数的两种:

    /**

     * Default construct: Uses default format and appearance.

     */

    public DigitalClock() {

       super();

       setFont(new Font("Arial", Font.BOLD, 20));

       setOpaque(true);

       padding1 = ":";

       padding2 = ".";

       setUI(DigitalClockUI.createUI(this));

    }

    /**

* Constructor: Initializes a digital-type clock by using given *parameters.

     */

    public DigitalClock(String padding1, String padding2, Font font,

           Color fg, Color bg, Locale locale) {

通过setUI(DigitalClockUI.createUI(this));把新的自定义UI赋给JComponent.

最后通过addNotifyremoveNotify方法复写启动和终止计时Timer

    /**

     * Invoked when panel is added to a container.

     */

    @Override

    publicvoid addNotify() {

       super.addNotify();

       getUI().start();

    }

    /**

     * Invoked when panel is removed from a container.

     */

    @Override

    publicvoid removeNotify() {

       getUI().stop();

       super.removeNotify();

    }

最后就是DigitalClockUI类了,它主要提供页面的绘制,计时Timer的管理和时间的计算以及界面大小的调整功能.

首先是继承关系:

publicclass DigitalClockUI extends PanelUI implements ActionListener {

它通过继承PanelUI(其实就是ComponentUI)实现时钟界面UI管理,实现ActionListener接口则是为了SwingTimer.

在构造函数中,Timer启动   

// stopwatch

       timer = new Timer(10, this);

仿照其他Component组件提供UI代理,使界面可以设置UI:

// Create an instance of the UI delegate for this component

    publicstatic ComponentUI createUI(DigitalClock component) {

       returnnew DigitalClockUI(component);

    }

然后定义类使用的属性:

    // Attributed string containing current time

    protected AttributedString timeString = null;

    // Text layout of attributed string

    protected TextLayout textLayout = null;

    // Attributed string containing current timezone.

    protected AttributedString timezoneString = null;

    // Text layout of attributed timezone.

    protected TextLayout textTimezoneLayout = null;

分别定义了绘制时间和时区的字符串属性格式和布局.

当组件加入到容器中呈现时,Timer启动,actionPerformed将会被调用.

    @Override

    publicvoid actionPerformed(ActionEvent event) {

在这个方法里,取得当前时间:

       // Create a new attributed string with the new time

       Date current = new Date();

       Calendar cal = panel.getCalendar();

       cal.setTime(current);

通过SimpleDateFormat类把时间格式化:

    // Hour24 mode

       df = new SimpleDateFormat("HH" + panel.getPadding1() + "mm"

              + panel.getPadding1() + "ss", panel.getLocale());

       // Draw AM/PM

       int tmpLen2 = 0;

       // mode

       df.applyPattern("a");

       // timezone

       df.applyPattern("Z");

       StringBuffer sb = new StringBuffer("GMT");

       sb.append(df.format(current));

       sb.insert(6, ":");

       df.applyPattern("zzzz");

然后将格式化好的时间字符串通过AttributedString设置显示格式:

timeString = new AttributedString(str);

// Render main time area

timeString.addAttribute(TextAttribute.FONT, font, 0, 6 + 2 * panel

              .getPadding1().length());

timeString.addAttribute(TextAttribute.FOREGROUND,panel.getForeground());

// Do blinking if reach alarm point

timeString.addAttribute(TextAttribute.FOREGROUND,

              panel.getForeground(), 0, 6 + 2 * panel.getPadding1().length());

// Render padding1, do blinking

timeString.addAttribute(TextAttribute.FOREGROUND, blink == 0 ? panel

              .getForeground() : panel.getBackground(), 2, 2 + panel

              .getPadding1().length());

timeString.addAttribute(TextAttribute.FOREGROUND, blink == 0 ? panel

              .getForeground() : panel.getBackground(), 2 + panel

              .getPadding1().length() + 2, 4 + 2 * panel.getPadding1()

              .length());

然后设置TextLayout

       // Create a new text layout and signal the panel that it needs

       // repainting

       textLayout = null;

       textLayout = new TextLayout(timeString.getIterator(), Clock.frc);

最后根据字符串大小设置组件大小,刷新

    // To keep the clock size fit for

       // actual size in time.

       panel.setSize(getPreferredSize(panel));

       panel.repaint();

       current = null;

       df = null;

最后一个方法是复写getPreferredSize使组件可以自适应大小

    // Return the preferred size for the component

    @Override

    public Dimension getPreferredSize(JComponent c) {

首先得出两个字符串大小:

Dimension size1 = textLayout.getBounds().getBounds().getSize();

Dimension size2 = textTimezoneLayout == null ? null : textTimezoneLayout.getBounds().getBounds().getSize();

然后宽度取2者大的,再额外增加一点Border

int max = width1;

       if (width2 > max)

           max = width2;

       size.width = max + MARGIN + 2;

高度选取2者之和加上两者间的间隙:

int height1 = (int) (textLayout.getAscent() + textLayout.getDescent() + textLayout.getLeading());

int height2 = (int) (textTimezoneLayout == null ? 0 : textTimezoneLayout.getAscent()+ textTimezoneLayout.getDescent() + textTimezoneLayout.getLeading());

size.height = (height1 + MARGIN) + (height2 + MARGIN);

到此为止,最简单的数字时钟就完成了.

通过

private DigitalClock getDigitalClock() {

    if (digitalClock == null) {

       // To create a digital-type clock with dark

       // red foreground and black background.

       digitalClock = new DigitalClock(":", "'", new Font("Comic Sans MS",Font.BOLD, 20), Color.GREEN.darker(), Color.BLACK

                  .brighter(), Locale.ENGLISH);

       }

       returndigitalClock;

    }

取得数字时钟组件,然后就和一般Java组件一样使用了.

分享到:
评论

相关推荐

    java 实现数字时钟 实例代码

    java 实现数字时钟 实例代码java 实现数字时钟 实例代码

    Java模拟数字时钟

    Java窗口程序模拟的数字时钟特效。GregorianCalender类是Calender类的一个具体子类,提供了世界上大多数国家和地区使用的标准日历系统。可将本项目直接导入Eclipse或MyE运行ElectronicClock类,生成效果。

    Java练手_电子时钟

    Java练习,制作了一个简单的数字时钟,用到了Java的线程、AWT绘图、Swing等知识点。

    一个简易的JAVA数字时钟支持24时12时转换

    体格可以在12时显示与24时显示之间切换的数字时钟,经过指导老师调试通过,保证能用,如果不行换一下JAVA的版本,希望支持。

    Java实现的简单数字时钟功能示例

    主要介绍了Java实现的简单数字时钟功能,涉及java日期时间及JFrame框架图形界面操作相关实现技巧,需要的朋友可以参考下

    基于java.swing时钟.java

    编写一个简单的基于swing的时钟程序,可以在Frame的最上方显示实时时间,显示格式,hh:mm:ss,24小时刻,要求使用SimpleDateFormat来格式化显示样式,并合理安排cpu占用时间

    Java数字时钟源代码

    摘要:JAVA源码,系统相关,数字时钟 Java 数字时钟,用Java代码实现一个漂亮且实用的数字时钟,源码中调用了paint方法重绘界面,重载组件的paint方法,得到Graphics2D对象,实例化日历对象得到时、分、秒,然后格式化...

    Java源码包100个设计实例.zip

    Java 数字签名、数字证书生成源码.rar Java 版的酒店系统,貌似完整.rar Java 电梯模拟程序 v2.0.rar Java 组播组中发送和接受数据实例 Java 飞机订票.rar Java 高考信息管理系统 SQL数据库.rar Java (Jsp)制作...

    java源码包---java 源码 大量 实例

     用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有帮助。 Message-Driven Bean EJB实例源代码 2个目标文件 摘要:Java源码,初学实例,EJB实例  Message-Driven Bean EJB实例源代码,演示...

    JAVA上百实例源码以及开源项目

     用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有帮助。 Message-Driven Bean EJB实例源代码 2个目标文件 摘要:Java源码,初学实例,EJB实例  Message-Driven Bean EJB实例源代码,演示...

    JAVA上百实例源码以及开源项目源代码

     用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有帮助。 Message-Driven Bean EJB实例源代码 2个目标文件 摘要:Java源码,初学实例,EJB实例  Message-Driven Bean EJB实例源代码,演示...

    java源码包4

     用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有帮助。 Message-Driven Bean EJB实例源代码 2个目标文件 摘要:Java源码,初学实例,EJB实例  Message-Driven Bean EJB实例源代码,...

    java源码包3

     用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有帮助。 Message-Driven Bean EJB实例源代码 2个目标文件 摘要:Java源码,初学实例,EJB实例  Message-Driven Bean EJB实例源代码,...

    java源码包2

     用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有帮助。 Message-Driven Bean EJB实例源代码 2个目标文件 摘要:Java源码,初学实例,EJB实例  Message-Driven Bean EJB实例源代码,...

    Java语言编写的带有数码时钟的计算器

    Java语言编写的带有数码时钟的计算器,Java语言编写的带有数码时钟的计算器;完成简单的计算。

    Java案例开发锦集

    案例3 用JDOM解析XML文件 案例4 Java编制的时钟 案例5 简单日历 案例6 系统内存状态监视程序 案例7 简单计算器 案例8 多线程断点续传 案例9 笛卡尔曲线 第四章 Java与游戏 案例1 ...

    Java开发技术大全(500个源代码).

    converseNumber.java 逆向输出数字 daffodilNumber.java 求水仙花数 division.java 演示整除结果 errorCompoundVariable.java 错误使用局部变量示例 factorial.java 求阶乘 Fibonacci.java 求Fiblnacci数列 ...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java圆形电子时钟源代码 1个目标文件 内容索引:JAVA源码,系统相关,电子钟 用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有帮助。 Message-Driven Bean EJB实例源代码 2个目标文件 摘要:...

    java jdk实列宝典 光盘源代码

    滚动的消息,实现一个简单的动画,具有滚动效果的文本消息RollingMessage.java; 三维弹球,BouncingB.java; 贪吃蛇游戏SnakeModel.java; java的声音处理,介绍java中如何处理声音,包括实现响铃,播放wav,au等音频...

    Java2实用教程.rar

    1 5一个简单的Java应用程序的开发过程 1 6一个简单的Java小应用程序 1 7什么是JSP 习题 第2章标识符 关键字和数据类型 2 1标识符和关键字 2 2Java的基本数据类型 2 3Java的数组 习题 第3章运算符 表达式和语句 3 1...

Global site tag (gtag.js) - Google Analytics