688
社区成员
发帖
与我相关
我的任务
分享| 这个作业属于哪个课程 | 2023年福大-软件工程实践-W班 |
|---|---|
| 这个作业要求在哪里 | 结对第二次作业--编程实现 |
| 结对学号 | 222000305、222000303 |
| 这个作业的目标 | 实现澳网公开赛可视化程序 |
| 其他参考文献 | ... |
| PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 30 | 30 |
| • Estimate | • 估计这个任务需要多少时间 | 30 | 30 |
| Development | 开发 | 1620 | 1815 |
| • Analysis | • 需求分析(包括学习新技术) | 30 | 60 |
| • Design Spec | • 生成设计文档 | 30 | 15 |
| • Design Review | • 设计复审 | 30 | 30 |
| • Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 60 | 90 |
| • Design | • 具体设计 | 120 | 180 |
| • Coding | • 具体编码 | 600 | 660 |
| • Code Review | • 代码复审 | 120 | 130 |
| • Test | • 测试(自我测试,修改代码,提交修改) | 630 | 650 |
| Reporting | 报告 | 105 | 80 |
| • Test Repor | • 测试报告 | 0 | 0 |
| • Size Measurement | • 计算工作量 | 45 | 40 |
| • Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 60 | 40 |
| 合计 | 1755 | 1925 |
本次作业所需数据均爬取自澳大利亚网球公开赛官网【该爬取行为仅用于课程教学】
通过选择日期来切换不同日期的赛程,大赛期间的十四天都能够显示。首页默认是每日赛程。鼠标移动到某一场比赛时需要高亮或显示边框提示。
左右显示男单女单前二十名的排名,为了让视觉观感好一点,相邻选手的颜色不同。
通过选择比赛类型能看到不同比赛类型的晋级图。鼠标移动到某一场比赛时需要高亮或显示边框提示。
讨论了下预期的开发安排

json数据复杂,分工讨论了一下

实际上类直接互相关联,于是……

反馈了问题



1.由于父Panel使用BorderLayout导致GridLayout的grid显示出现问题
将GridLayout放在BorderLayout后,由于BorderLayout的中部或者上部会随组件大小改变而自动调整大小,导致Grid在只有一行时需要主动填充空白导致比例不对,
为了解决这个问题,尝试将BorderLayout改为GridLayout,但大小受约束,于是使用GridBagLayout。
2.JScrollPane里有数据却无法显示,原因时JPanel默认布局是FlowLayout,add()参数却使用了BorderLayout,
解决方法是布局设为BorderLayout。
3.本地测试Webswing无法启动程序
通过localhost访问时总是显示断开连接,查询了服务日志后发现java18版本不适用于Webswing

4.部署程序出现的一系列问题
for (int i=0;i< matches.size();i++) {
Competition cpt=new Competition();
JSONObject match=matches.getJSONObject(i);
//读取court名
String courtId = (String) JSONPath.eval(match, "$.court_id");
cpt.setCourt((String) findById(courtId,"courts","name"));
//读取回合名
String roundId = (String) JSONPath.eval(match, "$.round_id");
cpt.setRound((String)findById(roundId,"rounds","name"));
//读取比赛类型
String eventId = (String) JSONPath.eval(match, "$.event_uuid");
cpt.setMatchType((String)findById(eventId,"events","name"));
//读取比赛状态
String status= (String) JSONPath.eval(match,"$.match_status.name");
cpt.setStatus(status);
//读取比赛时长
String duration= (String) JSONPath.eval(match,"$.duration");
String[] time=duration.split(":");
cpt.setDuration(time[0]+"h"+time[1]+"m");
//读取比分
JSONArray teams=match.getJSONArray("teams");
setScores(teams,cpt);
//读取选手信息
setPlayers(cpt);
list.add(cpt);
}
private Object findById(String id, String arrayName,String back){
JSONObject jsonObj= (JSONObject) object.getJSONArray(arrayName).stream()
.filter(obj->((JSONObject)obj).getString("uuid").equals(id))
.findFirst()
.orElse(null);
return JSONPath.eval(jsonObj,"$."+back);
}
public MainForm() {
super("澳大利亚网球公开赛2023");;
tabbedPane = new JTabbedPane();
scheduleForm = new ScheduleForm();
rankForm = new RankForm();
advanceForm = new AdvanceForm();
tabbedPane.addTab("每日赛程",scheduleForm);
tabbedPane.addTab("选手排名",rankForm);
tabbedPane.addTab("晋级图",advanceForm);
add(tabbedPane, BorderLayout.CENTER);
String[] head=new String[]{"每日赛程","选手排名","晋级图"};
for(int i=0;i<tabbedPane.getTabCount();i++){
JPanel tab=new JPanel();
tab.setPreferredSize(new Dimension(100,20));
JLabel label=new JLabel(head[i]);
tab.add(label);
tabbedPane.setTabComponentAt(i,tab);
}
setSize(1200, 720);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
// 从json数据中读取信息并通过builder转化为数据对象数组
for (int d = 0; d < 14; d++) {
String directoryName = "0" + date + ".json";
JSONObject jsonObject = JsonParserUtil.readJsonObject("schedule/" + directoryName);
date++;
CompetitionsBuilder builder = new CompetitionsBuilder(jsonObject);
ArrayList<Competition> arrayList = builder.build();
// ……
}
// 配置所需要生成的panel
JScrollPane jScrollPane;
JPanel scheduleJPanel1 = new JPanel(new GridLayout(0, 1, 1, 65));
JPanel scheduleJPanel2 = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
JPanel scheduleJPanel3 = new JPanel(new GridLayout(0, 3, 15, 10));
String courtName = "";
for (int i = 0; i < arrayList.size(); i++) {
Competition competition = arrayList.get(i);
if (!courtName.equals(competition.getCourt())) {
courtName = competition.getCourt();
}
ScheduleItem scheduleItem = new ScheduleItem(competition);
scheduleJPanel3.add(scheduleItem);
if (i == arrayList.size() - 1 || !courtName.equals(arrayList.get(i + 1).getCourt())) {
JLabel courtJLabel = new JLabel(courtName);
Font font = new Font("Serif", Font.BOLD, 25);
courtJLabel.setFont(font);
courtJLabel.setMinimumSize(new Dimension(100, 30));
c.gridx = 0;
c.gridy = 0;
c.weightx = 0;
c.weighty = 0;
c.anchor = GridBagConstraints.CENTER;
scheduleJPanel2.add(courtJLabel, c);
c.gridy++;
c.weightx = 0;
c.weighty = 0;
c.anchor = GridBagConstraints.NORTH;
JScrollPane pane = new JScrollPane(scheduleJPanel3);
pane.setBorder(BorderFactory.createLineBorder(Color.BLACK, 0));
scheduleJPanel2.add(pane, c);
scheduleJPanel1.add(scheduleJPanel2);
scheduleJPanel2 = new JPanel(new GridBagLayout());
scheduleJPanel3 = new JPanel(new GridLayout(0, 3, 15, 10));
}
}
jScrollPane = new JScrollPane(scheduleJPanel1);
jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
jScrollPaneArrayList.add(jScrollPane);
代码能力好,读取JSON文件和页面逻辑代码是由他写的,说实话是真的好用。人也很好沟通交流,遇到问题的时候能够帮我解决、改BUG。和他一组做项目还算轻松,不会很累。
能够及时发现我的错误并反馈,执行效率十分高,在推进项目进度时能够很好地完成所需要的部分并保证几乎无编译bug。善于发现和理解很多细节,比如帮助我分析json数据,检测bug等。