目录
题目:***16.29(显示一个日历)
编写一个程序,显示当前月的日历。可以使用Prior和Next按钮来显示前一个月和后一个月的日历。使用黑色字体显示当月日历中的日期,而使用灰色字体来显示前一个月和后一个月日历中的日期,如图16-48所示。
-
习题思路
- 创建两个HBox和一个GridPane,一个Date类型的参数,一个Label和两个Button。
- 把Label放置在第一个HBox中。
- 把两个Button放置在第二个HBox中。
- 创建一个Border,将第一个HBox设置在顶部,将GridPane放置在中心,把第二个HBox设置在底部。
- 定义一个方法,在方法内填充GridPane中的日期(使用Calendar转换日期)
- (方法内部)要想知道每个月的第一天是星期几和总天数是多少,可以用以下代码来获取
calendar.get(Calendar.DAY_OF_WEEK)-1//得到开始的星期 calendar.getActualMaximum(Calendar.DAY_OF_MONTH)//得到总天数
日期中空白的地方可以用一个空的Label代替
-
为两个Button注册事件,重新获取上下月日历
calendar.add(Calendar.MONTH, -1);//上一个月 calendar.add(Calendar.MONTH, 1);//下一个月 date = calendar.getTime(); getCalendar(date);//重新获取日历
-
代码示例
编程练习题16_29DisplayACalendar.java
package chapter_16;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart.Data;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.stage.Stage;
public class 编程练习题16_29DisplayACalendar extends Application{
private String currentYear = "";
private int currentMonth;
private HBox hBox;
private GridPane gridPane;
private HBox hBox2;
private Date date;
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
private Label lbYearAndMonth;
private Button btPrior;
private Button btNext;
@Override
public void start(Stage primaryStage) throws Exception {
hBox = new HBox();
hBox.setAlignment(Pos.CENTER);
date = new Date();
currentYear += (dateFormat.format(date).subSequence(0,4));
currentMonth = date.getMonth();
lbYearAndMonth = new Label(getDate(date));
hBox.getChildren().add(lbYearAndMonth);
gridPane = new GridPane();
gridPane.setAlignment(Pos.CENTER);
gridPane.setVgap(5);
gridPane.setHgap(5);
getCalendar(date);
hBox2 = new HBox(5);
btPrior = new Button("Prior");
btNext = new Button("Next");
EventHandler<ActionEvent> handler = e-> {
if (e.getSource() == btPrior){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MONTH, -1);
date = calendar.getTime();
getCalendar(date);
}else if (e.getSource() == btNext){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MONTH, 1);
date = calendar.getTime();
getCalendar(date);
}
};
btPrior.setOnAction(handler);;
btNext.setOnAction(handler);;
hBox2.setAlignment(Pos.CENTER);
hBox2.getChildren().addAll(btPrior,btNext);
BorderPane borderPane = new BorderPane();
borderPane.setTop(hBox);
borderPane.setCenter(gridPane);
borderPane.setBottom(hBox2);
Scene scene = new Scene(borderPane,400, 200);
primaryStage.setTitle("编程练习题16_29DisplayACalendar");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
public void getCalendar(Date date2) {
gridPane.getChildren().clear();
String[] DateOfWeek = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
for(int i = 0;i < 7;i++) {
Label label = new Label(DateOfWeek[i]);
gridPane.add(label, i, 0);
}
int x = 0;
int y = 1;
lbYearAndMonth.setText(getDate(date2));
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DATE,1);
int weekDay = calendar.get(Calendar.DAY_OF_WEEK)-1;
int dayMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
for(int i = 0;i < weekDay;i++) {
gridPane.add(new Label(""), x, y);
x++;
}
for(int i = 1;i <= dayMonth;i++) {
Label lb = new Label(i+"");
if(calendar.get(Calendar.YEAR) == Integer.valueOf(currentYear)&&calendar.get(Calendar.MONTH)==currentMonth) {
lb.setTextFill(Color.BLACK);
}else lb.setTextFill(Color.GRAY);
gridPane.add(lb, x, y);
x++;
if(x % 7 == 0) {y++;x=0;}
}
}
public static String getMonthName(int month) {
String monthName = "";
switch(month) {
case 1:monthName = "January";break;
case 2:monthName = "February";break;
case 3:monthName = "March";break;
case 4:monthName = "April";break;
case 5:monthName = "May";break;
case 6:monthName = "June";break;
case 7:monthName = "July";break;
case 8:monthName = "August";break;
case 9:monthName = "September";break;
case 10:monthName = "October";break;
case 11:monthName = "November";break;
case 12:monthName = "December";break;
}
return monthName;
}
public String getDate(Date date) {
String s = "";
s += getMonthName(date.getMonth()+1)+",";
s += (dateFormat.format(date).subSequence(0,4));
return s;
}
}
-
结果展示