Tạo chương trình chạy lùi thời gian


Bài viết này hướng dẫn bạn tạo ra một ứng dụng cho phép thời gian chạy ngược với ngôn ngữ lập trình Java. Bạn có thể áp dụng cách làm này để tạo ra các ứng dụng khác nhau như trong các chương trình trò chơi tính thời gian chẳng hạn. Chương trình sau đây…

Bài viết này hướng dẫn bạn tạo ra một ứng dụng cho phép thời gian chạy ngược với ngôn ngữ lập trình Java. Bạn có thể áp dụng cách làm này để tạo ra các ứng dụng khác nhau như trong các chương trình trò chơi tính thời gian chẳng hạn.

Chương trình sau đây sẽ thực hiện bật màn hình ở chế độ full screen và hiển thị số giây còn lại để sang năm mới tiếp theo. Mỗi giây trôi qua sẽ được cập nhật để đi đến thời điểm trọng đại nhất của năm mới. Tiếp theo đó là một thông điệp chúc mừng năm mới được hiện thị bất kể năm mới tiếp đó là gì.

  1. package test;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import java.text.NumberFormat;
  5. import java.util.*;
  6. import javax.swing.*;
  7. public class HappyNewYear implements Runnable {
  8. private static NumberFormat formatter = NumberFormat.getInstance();
  9. private JFrame frame;
  10. private JLabel label;
  11. private long newYearMillis;
  12. private String message;
  13. public HappyNewYear(JFrame frame, JLabel label) {
  14. // store argument GUI elements
  15. this.frame = frame;
  16. this.label = label;
  17. // compute beginning of next year
  18. Calendar cal = new GregorianCalendar();
  19. int nextYear = cal.get(Calendar.YEAR) + 1;
  20. cal.set(Calendar.YEAR, nextYear);
  21. cal.set(Calendar.MONTH, Calendar.JANUARY);
  22. cal.set(Calendar.DAY_OF_MONTH, 1);
  23. cal.set(Calendar.HOUR_OF_DAY, 0);
  24. cal.set(Calendar.MINUTE, 0);
  25. cal.set(Calendar.SECOND, 0);
  26. newYearMillis = cal.getTime().getTime();
  27. // prepare a message
  28. message = “Happy “ + nextYear + “!”;
  29. }
  30. public static int determineFontSize(JFrame frame,
  31. int componentWidth, String fontName, int fontStyle,
  32. String text) {
  33. int fontSize = componentWidth * 2 / text.length();
  34. Font font = new Font(fontName, fontStyle, fontSize);
  35. FontMetrics fontMetrics = frame.getGraphics().
  36. getFontMetrics(font);
  37. int stringWidth = fontMetrics.stringWidth(text);
  38. return (int) (fontSize * 0.95 *
  39. componentWidth / stringWidth);
  40. }
  41. public static void main(String[] args) {
  42. JFrame frame = new JFrame();
  43. frame.addKeyListener(new KeyListener() {
  44. public void keyPressed(KeyEvent event) {
  45. }
  46. public void keyReleased(KeyEvent event) {
  47. if (event.getKeyChar() == KeyEvent.VK_ESCAPE) {
  48. System.exit(0);
  49. }
  50. }
  51. public void keyTyped(KeyEvent event) {
  52. }
  53. });
  54. frame.setUndecorated(true);
  55. JLabel label = new JLabel(“.”);
  56. label.setBackground(Color.BLACK);
  57. label.setForeground(Color.WHITE);
  58. label.setOpaque(true);
  59. label.setHorizontalAlignment(SwingConstants.CENTER);
  60. frame.getContentPane().add(label);
  61. GraphicsEnvironment.getLocalGraphicsEnvironment().
  62. getDefaultScreenDevice().setFullScreenWindow(frame);
  63. final int fontStyle = Font.BOLD;
  64. final String fontName = “SansSerif”;
  65. int fontSizeNumber = determineFontSize(frame,
  66. Toolkit.getDefaultToolkit().getScreenSize().width,
  67. fontName, fontStyle, formatter.format(88888888));
  68. int fontSizeText = determineFontSize(frame,
  69. Toolkit.getDefaultToolkit().getScreenSize().width,
  70. fontName, fontStyle, “Happy 8888!”);
  71. label.setFont(new Font(fontName, fontStyle,
  72. Math.min(fontSizeNumber, fontSizeText)));
  73. new HappyNewYear(frame, label).run();
  74. }
  75. public void run() {
  76. boolean newYear = false;
  77. do {
  78. long time = System.currentTimeMillis();
  79. //newYearMillis=time+100000;
  80. long remaining = (newYearMillis – time) / 1000L;
  81. String output;
  82. if (remaining < 1) {
  83. // new year!
  84. newYear = true;
  85. output = message;
  86. else {
  87. // make a String from the number of seconds
  88. output = formatter.format(remaining);
  89. }
  90. label.setText(output);
  91. try {
  92. Thread.sleep(1000);
  93. catch (InterruptedException ie) {
  94. ie.printStackTrace(System.err);
  95. }
  96. while (!newYear);
  97. }
  98. }

package test; import java.awt.*; import java.awt.event.*; import java.text.NumberFormat; import java.util.*; import javax.swing.*; public class HappyNewYear implements Runnable {     private static NumberFormat formatter = NumberFormat.getInstance();     private JFrame frame;     private JLabel label;     private long newYearMillis;     private String message;     public HappyNewYear(JFrame frame, JLabel label) {         // store argument GUI elements         this.frame = frame;         this.label = label;         // compute beginning of next year         Calendar cal = new GregorianCalendar();         int nextYear = cal.get(Calendar.YEAR) + 1;         cal.set(Calendar.YEAR, nextYear);         cal.set(Calendar.MONTH, Calendar.JANUARY);         cal.set(Calendar.DAY_OF_MONTH, 1);         cal.set(Calendar.HOUR_OF_DAY, 0);         cal.set(Calendar.MINUTE, 0);         cal.set(Calendar.SECOND, 0);         newYearMillis = cal.getTime().getTime();         // prepare a message         message = “Happy ” + nextYear + “!”;     }     public static int determineFontSize(JFrame frame,             int componentWidth, String fontName, int fontStyle,             String text) {         int fontSize = componentWidth * 2 / text.length();         Font font = new Font(fontName, fontStyle, fontSize);         FontMetrics fontMetrics = frame.getGraphics().                 getFontMetrics(font);         int stringWidth = fontMetrics.stringWidth(text);         return (int) (fontSize * 0.95 *                 componentWidth / stringWidth);     }     public static void main(String[] args) {         JFrame frame = new JFrame();         frame.addKeyListener(new KeyListener() {             public void keyPressed(KeyEvent event) {             }             public void keyReleased(KeyEvent event) {                 if (event.getKeyChar() == KeyEvent.VK_ESCAPE) {                     System.exit(0);                 }             }             public void keyTyped(KeyEvent event) {             }         });         frame.setUndecorated(true);         JLabel label = new JLabel(“.”);         label.setBackground(Color.BLACK);         label.setForeground(Color.WHITE);         label.setOpaque(true);         label.setHorizontalAlignment(SwingConstants.CENTER);         frame.getContentPane().add(label);         GraphicsEnvironment.getLocalGraphicsEnvironment().                 getDefaultScreenDevice().setFullScreenWindow(frame);         final int fontStyle = Font.BOLD;         final String fontName = “SansSerif”;         int fontSizeNumber = determineFontSize(frame,                 Toolkit.getDefaultToolkit().getScreenSize().width,                 fontName, fontStyle, formatter.format(88888888));         int fontSizeText = determineFontSize(frame,                 Toolkit.getDefaultToolkit().getScreenSize().width,                 fontName, fontStyle, “Happy 8888!”);         label.setFont(new Font(fontName, fontStyle,                 Math.min(fontSizeNumber, fontSizeText)));         new HappyNewYear(frame, label).run();     }     public void run() {         boolean newYear = false;         do {             long time = System.currentTimeMillis();             //newYearMillis=time+100000;             long remaining = (newYearMillis – time) / 1000L;             String output;             if (remaining < 1) {                 // new year!                 newYear = true;                 output = message;             } else {                 // make a String from the number of seconds                 output = formatter.format(remaining);             }             label.setText(output);             try {                 Thread.sleep(1000);             } catch (InterruptedException ie) {                 ie.printStackTrace(System.err);             }         } while (!newYear);     } }

Qua chương trình này chúng ta có thể biết cách làm thế nào làm cho màn hình ở chế độ full screen, biết cách thao tác với dữ liệu ngày tháng, tiếp đến biết ứng dụng khái niệm phân tuyến để cập nhật lại thông tin thời gian. Đồng thời chương trình cũng chỉ ra cách tính toán cỡ phù hơp với kích thước màn hình đưa ra như thế nào cho cân đối nhất.

[HaiPhong-Aptech]

Advertisements
By dbglory Posted in Java

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s