用Java编写具有图形用户界面(GUI)的日历组件显示日期和时间并进行适当的功能扩充。 主要功能: 1、显示当月日历,当前日期、当前时间; 2、可查询任意月以及任意年的日历; 3、正常运行和退出程序。 4、每日具有记账功能,需要至少包含1)记账id;2)记账类型;2)支出费用;3)关键字(关键字写为一行,关键字数量不限,使用分号分割<需查阅使用>) 5、能够通过关键字查询某一种类型的记账记录。 6、对当月记账类型的汇总;对特定关键字的记账汇总。
时间: 2024-03-13 12:47:59 浏览: 89
好的,以下是一个简单的Java代码示例,可以实现你所描述的基本功能:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class CalendarApp extends JFrame implements ActionListener {
private JLabel timeLabel, dateLabel, monthLabel, yearLabel, dayLabel;
private JButton prevButton, nextButton, searchButton, exitButton;
private JTextField searchMonthField, searchYearField, idField, typeField, costField, keywordField;
private JTextArea accountArea;
private Map<String, String[]> accountMap;
private String[] monthNames;
public CalendarApp() {
// 初始化日历和账目数据
Calendar calendar = Calendar.getInstance();
accountMap = new HashMap<>();
monthNames = new String[]{"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
// 创建GUI界面布局
JPanel calendarPanel = new JPanel(new GridLayout(7, 7));
JPanel accountPanel = new JPanel(new BorderLayout());
JPanel buttonPanel = new JPanel(new FlowLayout());
JPanel searchPanel = new JPanel(new FlowLayout());
JPanel inputPanel = new JPanel(new GridLayout(5, 2));
// 创建GUI界面元素
timeLabel = new JLabel("", SwingConstants.CENTER);
dateLabel = new JLabel("", SwingConstants.CENTER);
monthLabel = new JLabel("", SwingConstants.CENTER);
yearLabel = new JLabel("", SwingConstants.CENTER);
dayLabel = new JLabel("", SwingConstants.CENTER);
prevButton = new JButton("Prev");
nextButton = new JButton("Next");
searchButton = new JButton("Search");
exitButton = new JButton("Exit");
searchMonthField = new JTextField(4);
searchYearField = new JTextField(4);
idField = new JTextField(10);
typeField = new JTextField(10);
costField = new JTextField(10);
keywordField = new JTextField(20);
accountArea = new JTextArea(10, 30);
JScrollPane accountScrollPane = new JScrollPane(accountArea);
// 将元素添加到对应的面板中
calendarPanel.add(new JLabel("Sun", SwingConstants.CENTER));
calendarPanel.add(new JLabel("Mon", SwingConstants.CENTER));
calendarPanel.add(new JLabel("Tue", SwingConstants.CENTER));
calendarPanel.add(new JLabel("Wed", SwingConstants.CENTER));
calendarPanel.add(new JLabel("Thu", SwingConstants.CENTER));
calendarPanel.add(new JLabel("Fri", SwingConstants.CENTER));
calendarPanel.add(new JLabel("Sat", SwingConstants.CENTER));
for (int i = 1; i <= 42; i++) {
JButton button = new JButton();
button.addActionListener(this);
calendarPanel.add(button);
}
buttonPanel.add(prevButton);
buttonPanel.add(nextButton);
searchPanel.add(new JLabel("Month"));
searchPanel.add(searchMonthField);
searchPanel.add(new JLabel("Year"));
searchPanel.add(searchYearField);
searchPanel.add(searchButton);
inputPanel.add(new JLabel("ID"));
inputPanel.add(idField);
inputPanel.add(new JLabel("Type"));
inputPanel.add(typeField);
inputPanel.add(new JLabel("Cost"));
inputPanel.add(costField);
inputPanel.add(new JLabel("Keyword"));
inputPanel.add(keywordField);
inputPanel.add(new JLabel(""));
inputPanel.add(new JLabel(""));
accountPanel.add(inputPanel, BorderLayout.NORTH);
accountPanel.add(accountScrollPane, BorderLayout.CENTER);
accountPanel.add(buttonPanel, BorderLayout.SOUTH);
// 添加元素到主面板中
JPanel mainPanel = new JPanel(new BorderLayout());
mainPanel.add(calendarPanel, BorderLayout.CENTER);
JPanel infoPanel = new JPanel(new BorderLayout());
infoPanel.add(timeLabel, BorderLayout.NORTH);
JPanel datePanel = new JPanel(new GridLayout(1, 3));
datePanel.add(monthLabel);
datePanel.add(dateLabel);
datePanel.add(yearLabel);
infoPanel.add(datePanel, BorderLayout.CENTER);
infoPanel.add(dayLabel, BorderLayout.SOUTH);
mainPanel.add(infoPanel, BorderLayout.NORTH);
mainPanel.add(searchPanel, BorderLayout.SOUTH);
mainPanel.add(accountPanel, BorderLayout.EAST);
// 设置窗口属性
add(mainPanel);
setTitle("Calendar App");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800, 600);
setLocationRelativeTo(null);
setVisible(true);
// 添加按钮事件监听器
prevButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
calendar.add(Calendar.MONTH, -1);
updateCalendar(calendar);
}
});
nextButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
calendar.add(Calendar.MONTH, 1);
updateCalendar(calendar);
}
});
searchButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int month = Integer.parseInt(searchMonthField.getText()) - 1;
int year = Integer.parseInt(searchYearField.getText());
calendar.set(year, month, 1);
updateCalendar(calendar);
}
});
exitButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
// 初始更新日历和时间
updateCalendar(calendar);
updateTime();
}
// 更新日历界面
public void updateCalendar(Calendar calendar) {
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
int firstDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
int prevMonthDays = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
int nextMonthDays = 1;
// 更新日历面板中的日期按钮
for (int i = 7; i < 49; i++) {
JButton button = (JButton) getContentPane().getComponent(i);
button.setText("");
button.setBackground(Color.WHITE);
button.setEnabled(false);
}
for (int i = 1; i <= daysInMonth; i++) {
JButton button = (JButton) getContentPane().getComponent(i + firstDayOfWeek + 5);
button.setText(Integer.toString(i));
button.setBackground(Color.WHITE);
button.setEnabled(true);
}
for (int i = 1; i < firstDayOfWeek; i++) {
JButton button = (JButton) getContentPane().getComponent(i + firstDayOfWeek - 2);
button.setText(Integer.toString(prevMonthDays));
button.setBackground(Color.LIGHT_GRAY);
button.setEnabled(false);
prevMonthDays--;
}
for (int i = daysInMonth + firstDayOfWeek + 5; i <= 48; i++) {
JButton button = (JButton) getContentPane().getComponent(i);
button.setText(Integer.toString(nextMonthDays));
button.setBackground(Color.LIGHT_GRAY);
button.setEnabled(false);
nextMonthDays++;
}
// 更新日期和月份标签
monthLabel.setText(monthNames[month]);
dateLabel.setText(Integer.toString(day));
yearLabel.setText(Integer.toString(year));
// 更新当月记账汇总
updateAccountSummary(month, year);
}
// 更新当月记账汇总
public void updateAccountSummary(int month, int year) {
double totalCost = 0;
Map<String, Double> typeMap = new HashMap<>();
for (String[] values : accountMap.values()) {
int m = Integer.parseInt(values[0].substring(5, 7));
int y = Integer.parseInt(values[0].substring(0, 4));
if (m == month + 1 && y == year) {
totalCost += Double.parseDouble(values[2]);
String type = values[1];
if (typeMap.containsKey(type)) {
double cost = typeMap.get(type) + Double.parseDouble(values[2]);
typeMap.put(type, cost);
} else {
typeMap.put(type, Double.parseDouble(values[2]));
}
}
}
StringBuilder summaryBuilder = new StringBuilder();
summaryBuilder.append("Total Cost: $").append(totalCost).append("\n\n");
for (String type : typeMap.keySet()) {
double cost = typeMap.get(type);
summaryBuilder.append(type).append(": $").append(cost).append("\n");
}
accountArea.setText(summaryBuilder.toString());
}
// 更新时间标签
public void updateTime() {
SimpleDateFormat timeFormat = new SimpleDateFormat("hh:mm:ss a");
String time = timeFormat.format(new Date());
timeLabel.setText(time);
dayLabel.setText(new SimpleDateFormat("EEEE").format(new Date()));
Timer timer = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
updateTime();
}
});
timer.setRepeats(false);
timer.start();
}
@Override
public void actionPerformed(ActionEvent e) {
JButton button = (JButton) e.getSource();
String day = button.getText();
int month = Arrays.asList(monthNames).indexOf(monthLabel.getText());
int year = Integer.parseInt(yearLabel.getText());
if (day.equals("")) {
return;
}
String selectedDate = String.format("%04d-%02d-%02d", year, month + 1, Integer.parseInt(day));
String id = idField.getText();
String type = typeField.getText();
String cost = costField.getText();
String[] keywords = keywordField.getText().split(";");
accountMap.put(id, new String[]{selectedDate, type, cost, keywordField.getText()});
updateAccountSummary(month, year);
}
public static void main(String[] args) {
new CalendarApp();
}
}
```
这个例子中,我们使用Java的Swing库来创建GUI界面,使用Calendar类和SimpleDateFormat类来处理日期和时间,使用HashMap来存储记账记录。具体实现过程中,我们创建了一个JFrame窗口,并在窗口中添加了一个日历面板、一个查询面板和一个记账面板。我们通过监听按钮事件来实现日历的翻页、查询功能以及记账记录的添加,并在界面中实时显示当月记账汇总。
阅读全文