使用JavaFX设置一个简单日历

来源:互联网 发布:mac windows虚拟机 编辑:程序博客网 时间:2024/06/04 23:35

1.先看效果:


2.代码:

1)ClockEdge.java类

这个类(Pane)主要是用来设置时钟边缘(为了美观对直了半天,其实想想也没必要~。~)

package com.javaBasic.javaFX;    import javafx.scene.layout.Pane;import javafx.scene.paint.Color;import javafx.scene.shape.Circle;import javafx.scene.shape.Line;import javafx.scene.text.Text;    /**  * @version 1.00 2016-10-15  * @author Administrator  * 功能:显示时钟边缘  */  public class ClockEdge extends Pane{      private double w , h;      public ClockEdge(){          this(200, 200);          paint();      }      public ClockEdge(double w, double h){          this.w = w;          this.h = h;          paint();      }      public double getW() {          return w;      }      public void setW(double w) {          this.w = w;          paint();      }      public double getH() {          return h;      }      public void setH(double h) {          this.h = h;          paint();      }      public void paint(){          double clockRadius = Math.min(w, h) * 0.8 * 0.5;          double centerX = w / 2;          double centerY = h / 2;          Circle circle = new Circle(centerX, centerY, clockRadius);          circle.setFill(Color.WHITE);          circle.setStroke(Color.BLACK);          //假设一个字符宽7.6个像素,高8.8个像素          Text text1 = new Text(centerX + clockRadius * Math.sin(1 * Math.PI / 6) - 7.6 + 1.7 * (1 + Math.cos(2 * Math.PI / 6)) - 2.2 * Math.sin(2 * Math.PI / 6),                                 centerY - clockRadius * Math.cos(1 * Math.PI / 6) + 8.8 + 1.7 * Math.sin(2 * Math.PI / 6) - 2.2 * (1 -  Math.cos(2 * Math.PI / 6)), "1");          Text text2 = new Text(centerX + clockRadius * Math.sin(2 * Math.PI / 6) - 7.6 + 1.7 * (1 + Math.cos(4 * Math.PI / 6)) - 2.2 * Math.sin(4 * Math.PI / 6),                                 centerY - clockRadius * Math.cos(2 * Math.PI / 6) + 8.8 + 1.7 * Math.sin(4 * Math.PI / 6) - 2.2 * (1 -  Math.cos(4 * Math.PI / 6)), "2");          Text text3 = new Text(centerX + clockRadius * Math.sin(3 * Math.PI / 6) - 7.6 + 1.7 * (1 + Math.cos(6 * Math.PI / 6)) - 2.2 * Math.sin(6 * Math.PI / 6),                                  centerY - clockRadius * Math.cos(3 * Math.PI / 6) + 8.8 + 1.7 * Math.sin(6 * Math.PI / 6) - 2.2 * (1 -  Math.cos(6 * Math.PI / 6)), "3");          Text text4 = new Text(centerX + clockRadius * Math.sin(4 * Math.PI / 6) - 7.6 + 1.7 * (1 + Math.cos(8 * Math.PI / 6)) + 2.2 * Math.sin(8 * Math.PI / 6),                                 centerY - clockRadius * Math.cos(4 * Math.PI / 6) + 1.7 * Math.sin(8 * Math.PI / 6) + 2.2 * (1 -  Math.cos(8 * Math.PI / 6)), "4");          Text text5 = new Text(centerX + clockRadius * Math.sin(5 * Math.PI / 6) - 7.6 + 1.7 * (1 + Math.cos(10 * Math.PI / 6)) + 2.2 * Math.sin(10 * Math.PI / 6),                                 centerY - clockRadius * Math.cos(5 * Math.PI / 6) + 1.7 * Math.sin(10 * Math.PI / 6) + 2.2 * (1 -  Math.cos(10 * Math.PI / 6)), "5");          Text text6 = new Text(centerX + clockRadius * Math.sin(6 * Math.PI / 6) - 7.6 + 1.7 * (1 + Math.cos(12 * Math.PI / 6)) + 2.2 * Math.sin(12 * Math.PI / 6),                                centerY - clockRadius * Math.cos(6 * Math.PI / 6) + 1.7 * Math.sin(12 * Math.PI / 6) + 2.2 * (1 -  Math.cos(12 * Math.PI / 6)), "6");          Text text7 = new Text(centerX + clockRadius * Math.sin(7 * Math.PI / 6) - 1.7 * (1 + Math.cos(14 * Math.PI / 6)) + 2.2 * Math.sin(14 * Math.PI / 6),                                 centerY - clockRadius * Math.cos(7 * Math.PI / 6) - 1.7 * Math.sin(14 * Math.PI / 6) + 2.2 * (1 -  Math.cos(14 * Math.PI / 6)), "7");          Text text8 = new Text(centerX + clockRadius * Math.sin(8 * Math.PI / 6) - 1.7 * (1 + Math.cos(16 * Math.PI / 6)) + 2.2 * Math.sin(16 * Math.PI / 6),                                  centerY - clockRadius * Math.cos(8 * Math.PI / 6) - 1.7 * Math.sin(16 * Math.PI / 6) + 2.2 * (1 -  Math.cos(16 * Math.PI / 6)), "8");          Text text9 = new Text(centerX + clockRadius * Math.sin(9 * Math.PI / 6) - 1.7 * (1 + Math.cos(18 * Math.PI / 6)) + 2.2 * Math.sin(18 * Math.PI / 6),                                centerY - clockRadius * Math.cos(9 * Math.PI / 6) - 1.7 * Math.sin(18 * Math.PI / 6) + 2.2 * (1 -  Math.cos(18 * Math.PI / 6)), "9");          Text text10 = new Text(centerX + clockRadius * Math.sin(10 * Math.PI / 6) - 3.8 * (1 + Math.cos(20 * Math.PI / 6)) - 2.2 * Math.sin(20 * Math.PI / 6),                                  centerY - clockRadius * Math.cos(10 * Math.PI / 6) + 8.8 - 3.8 * Math.sin(20 * Math.PI / 6) - 2.2 * (1 - Math.cos(20 * Math.PI / 6)), "10");          Text text11 = new Text(centerX + clockRadius * Math.sin(11 * Math.PI / 6) - 3.8 * (1 + Math.cos(22 * Math.PI / 6)) - 2.2 * Math.sin(22 * Math.PI / 6),                                   centerY - clockRadius * Math.cos(11 * Math.PI / 6) + 8.8 - 3.8 * Math.sin(22 * Math.PI / 6) - 2.2 * (1 - Math.cos(22 * Math.PI / 6)), "11");          Text text12 = new Text(centerX + clockRadius * Math.sin(12 * Math.PI / 6) - 3.8 * (1 + Math.cos(24 * Math.PI / 6)) - 2.2 * Math.sin(24 * Math.PI / 6),                                  centerY - clockRadius * Math.cos(12 * Math.PI / 6) + 8.8 - 3.8 * Math.sin(24 * Math.PI / 6) - 2.2 * (1 - Math.cos(24 * Math.PI / 6)), "12");          getChildren().addAll(circle, text1, text2, text3, text4, text5, text6, text7, text8, text9, text10, text11, text12);          for(int i =1; i<= 60; i++){              double pointX1 = centerX + clockRadius * 0.95 * Math.sin(i * (2 * Math.PI) / 60);               double pointY1 = centerY - clockRadius * 0.95 * Math.cos(i * (2 * Math.PI) / 60);              double pointX2 = centerX + clockRadius * 1.0 * Math.sin(i * (2 * Math.PI) / 60);               double pointY2 = centerY - clockRadius * 1.0 * Math.cos(i * (2 * Math.PI) / 60);              if(i % 5 == 0) continue;              else{                  Line point = new Line(pointX1, pointY1, pointX2, pointY2);                  getChildren().add(point);              }          }      }        }  

2)ClockPointer.java类

这个类(Pane)主要用来显示时钟的三个指针(时、分、秒);

package com.javaBasic.javaFX;    import java.util.Calendar;  import java.util.GregorianCalendar;  import javafx.scene.layout.Pane;  import javafx.scene.paint.Color;  import javafx.scene.shape.Line;  /**  * @version 1.00 2016-10-15  * @author Administrator  * 功能:显示时钟指针  */  public class ClockPointer extends Pane{      private int hour;      private int minute;      private int second;      private double w = 200, h = 200;      public ClockPointer(){          setCurrentTime();      }      public ClockPointer(int hour, int minute, int second){          this.hour = hour;          this.minute = minute;          this.second = second;          paint();          }      public int getHour(){          return hour;      }      public void setHour(int hour){          this.hour = hour;          paint();      }      public int getMinute(){          return minute;      }      public void setMinute(int minute){          this.minute = minute;          paint();      }      public int getSecond(){          return second;      }      public void setSecond(int second){          this.second = second;          paint();      }      public double getW() {          return w;      }      public void setW(double w) {          this.w = w;          paint();      }      public double getH() {          return h;      }      public void setH(double h) {          this.h = h;          paint();      }      public String setCurrentTime(){     String str1, str2, str3;        Calendar calendar = new GregorianCalendar();          this.hour = calendar.get(Calendar.HOUR_OF_DAY);          this.minute = calendar.get(Calendar.MINUTE);          this.second = calendar.get(Calendar.SECOND);        str1 = String.valueOf(hour);        str2 = String.valueOf(minute);        str3 = String.valueOf(second);if (hour < 10) {str1 = "0" + hour;}if (minute < 10) {str2 = "0" + minute;}if (second < 10) {str3 = "0" + second;}        paint();        return str1 + " : " + str2 + " : " + str3;     }      protected void paint(){          getChildren().clear();          double clockRadius = Math.min(w, h) * 0.8 * 0.5;          double centerX = w / 2;          double centerY = h / 2;           double sLength = clockRadius * 0.8;          double secondX = centerX + sLength * Math.sin(second * (2 * Math.PI) / 60);           double secondY = centerY - sLength * Math.cos(second * (2 * Math.PI) / 60);           Line sLine = new Line(centerX, centerY, secondX, secondY);          sLine.setStroke(Color.RED);          double mLength = clockRadius * 0.65;          double minuteX = centerX + mLength * Math.sin(minute * (2 * Math.PI) / 60);           double minuteY = centerY - mLength * Math.cos(minute * (2 * Math.PI) / 60);           Line mLine = new Line(centerX, centerY, minuteX, minuteY);          mLine.setStroke(Color.BLUE);          double hLength = clockRadius * 0.5;          double hourX = centerX + hLength * Math.sin(hour * (2 * Math.PI) / 12);           double hourY = centerY - hLength * Math.cos(hour * (2 * Math.PI) / 12);           Line hLine = new Line(centerX, centerY, hourX, hourY);          mLine.setStroke(Color.GREEN);          getChildren().addAll(sLine, mLine, hLine);        }  }  

3)CalendarPanel.java类

这个类(Pane)用来显示日历(这里用到了一个字体Cooper Black一般系统应该都有,没有就得添加)


package com.javaBasic.javaFX;    import javafx.scene.layout.Pane;  import javafx.scene.layout.ColumnConstraints;  import javafx.scene.layout.GridPane;  import javafx.scene.control.Label;  import javafx.scene.paint.Color;  import javafx.geometry.HPos;  import javafx.geometry.Insets;  import javafx.geometry.Pos;  import javafx.scene.text.Font;  import javafx.scene.text.FontWeight;  import javafx.scene.text.Text;  import java.util.Calendar;  /**  * @version 1.00 2016-10-17  * @author Administrator  * 功能:显示日历  */    public class CalendarPanel extends Pane{      private int year;      private int month;      private int day;      private int firstDayOfWeek;      private int totalDayOfMonth;            public CalendarPanel(){                    Calendar calendar = Calendar.getInstance();          year = calendar.get(Calendar.YEAR);          month = calendar.get(Calendar.MONTH) + 1;          day = calendar.get(Calendar.DAY_OF_MONTH);          totalDayOfMonth = calendar.getActualMaximum(Calendar.DATE);          calendar.set(Calendar.DAY_OF_MONTH, 1);          firstDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;          paint();      }      public void paint(){          GridPane cp = new GridPane();          String[] week = new String[]{"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};          cp.setPadding(new Insets(30, 30, 10, 10));          Text text1 = new Text(year + "年" + month + "月");          text1.setStroke(Color.GREEN);          cp.setAlignment(Pos.CENTER);          cp.add(text1, 0, 0);          GridPane.setColumnSpan(text1, 7);          GridPane.setHalignment(text1, HPos.CENTER);          for(int i = 0; i < 7; i++){              Label label = new Label(week[i]);              if(i == 0 || i == 6) label.setTextFill(Color.RED);              cp.add(label, i, 1);              cp.getColumnConstraints().add(new ColumnConstraints(30));              GridPane.setHalignment(label, HPos.CENTER);          }          for(int j = 0; j < totalDayOfMonth; j++){              Label label = new Label(j + 1 +"");              if (j + 1 == day) label.setFont(Font.font("Cooper Black", FontWeight.BOLD, 20));              int k = firstDayOfWeek + j;              if((k % 7 == 0) || (k % 7 == 6)) label.setTextFill(Color.RED);              cp.add(label, k % 7, 2 + k / 7);              GridPane.setHalignment(label, HPos.RIGHT);            }          getChildren().add(cp);        }    }  

4)主面板ClockMainPanel.java

这个类(Pane)是用于将上面三个面板合成主面板


package com.javaBasic.javaFX;    import javafx.animation.KeyFrame;import javafx.animation.Timeline;import javafx.application.Application;import javafx.event.ActionEvent;import javafx.event.EventHandler;import javafx.scene.Scene;import javafx.scene.layout.BorderPane;import javafx.scene.layout.StackPane;import javafx.scene.text.Font;import javafx.scene.text.Text;import javafx.stage.Stage;import javafx.util.Duration;  /**  * @version 1.00 2016-10-17  * @author Administrator  * 功能:各个面板Pane合成一个时钟面板ClockMainPanel  */  public class ClockMainPanel extends Application {      String NowTime;      public static void main(String[] args) {          // TODO Auto-generated method stub          Application.launch(args);      }      public void start(Stage primaryStage){          ClockEdge ce = new ClockEdge();          ClockPointer cp = new ClockPointer();          StackPane sp = new StackPane(ce, cp);          StackPane nt = new StackPane();          CalendarPanel caPa = new CalendarPanel();          BorderPane bp = new BorderPane();          bp.setLeft(sp);          bp.setRight(caPa);          bp.setBottom(nt);          Scene scene = new Scene(bp, 420, 200);          EventHandler<ActionEvent> eventHandler = e ->{              nt.getChildren().clear();              NowTime = (String) cp.setCurrentTime();             Text tt= new Text(NowTime);            tt.setFont(Font.font("Times New Roman", 20));            nt.getChildren().add(tt);          };          Timeline animation = new Timeline(              new KeyFrame(Duration.millis(1000), eventHandler));          animation.setCycleCount(Timeline.INDEFINITE);          animation.play();          primaryStage.setTitle("Perpetual calendar");          primaryStage.setScene(scene);          primaryStage.show();      }  }  


0 0
原创粉丝点击