用java的swing图形界面采用表格显示裁判评分,随裁判人数变化而变化;指定分数范围,若超出,则异常处理;得分规则有指定接口约定,由多个接口对象给出多种得分规则,如求平均数值,或去掉一个最高分与一个最低分后,再求平均值。
时间: 2024-01-05 08:05:03 浏览: 64
好的,这是一个关于Java Swing图形界面的表格显示裁判评分的问题,根据裁判人数的变化,表格也需要相应的变化。同时,需要对超出指定分数范围的情况进行异常处理。得分规则由多个接口对象给出,可以包括求平均数值或去掉一个最高分和一个最低分后再求平均值等多种规则。下面是一个简单的代码示例:
```java
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ScoreTable extends JFrame {
private JTable table;
private JScrollPane scrollPane;
private DefaultTableModel model;
private List<Double> scores;
private double maxScore;
private double minScore;
public ScoreTable() {
scores = new ArrayList<>();
table = new JTable();
scrollPane = new JScrollPane(table);
model = new DefaultTableModel();
model.addColumn("评分人数");
model.addColumn("得分");
table.setModel(model);
add(scrollPane);
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public void addScore(double score) throws ScoreOutOfRangeException {
if (score < 0 || score > 100) {
throw new ScoreOutOfRangeException();
} else {
scores.add(score);
updateTable();
}
}
public void updateTable() {
model.setRowCount(0);
int count = scores.size();
model.addRow(new Object[]{count, String.format("%.2f", scores.get(count - 1))});
// 更新最高分和最低分
Collections.sort(scores, Comparator.reverseOrder());
maxScore = scores.get(0);
minScore = scores.get(count - 1);
// 更新平均分
double sum = 0;
for (double score : scores) {
sum += score;
}
double avg = sum / count;
model.addRow(new Object[]{"最高分", String.format("%.2f", maxScore)});
model.addRow(new Object[]{"最低分", String.format("%.2f", minScore)});
model.addRow(new Object[]{"平均分", String.format("%.2f", avg)});
}
// 接口定义得分规则
public interface ScoreRule {
double calcScore(List<Double> scores);
}
// 求平均数值得分规则
public static class AvgRule implements ScoreRule {
@Override
public double calcScore(List<Double> scores) {
double sum = 0;
for (double score : scores) {
sum += score;
}
return sum / scores.size();
}
}
// 去掉一个最高分和一个最低分后再求平均值得分规则
public static class TrimRule implements ScoreRule {
@Override
public double calcScore(List<Double> scores) {
double sum = 0;
Collections.sort(scores);
for (int i = 1; i < scores.size() - 1; i++) {
sum += scores.get(i);
}
return sum / (scores.size() - 2);
}
}
public static void main(String[] args) {
ScoreTable scoreTable = new ScoreTable();
List<Double> scores = new ArrayList<>();
scores.add(80.0);
scores.add(90.0);
scores.add(70.0);
scores.add(60.0);
scores.add(85.0);
scoreTable.scores = scores;
scoreTable.updateTable();
// 使用不同的规则计算分数
ScoreRule avgRule = new AvgRule();
ScoreRule trimRule = new TrimRule();
System.out.println("平均分:" + avgRule.calcScore(scores));
System.out.println("去掉一个最高分和一个最低分后的平均分:" + trimRule.calcScore(scores));
}
}
// 分数超出指定范围时抛出异常
class ScoreOutOfRangeException extends Exception {
public ScoreOutOfRangeException() {
super("分数超出指定范围!");
}
}
```
这个程序中,我们定义了一个`ScoreTable`类,它继承自`JFrame`,表示我们的界面。在界面中,我们使用了一个`JTable`来显示评分情况,使用`DefaultTableModel`作为数据模型。我们定义了一个`scores`列表来存储所有的评分,并且在`addScore`方法中,我们判断了分数是否超出指定范围,并且在更新评分时,我们更新了最高分、最低分和平均分等数据。同时,我们定义了两个接口来规定得分的计算规则,一个是求平均数值,一个是去掉一个最高分和一个最低分后再求平均值。在`main`方法中,我们使用这两种规则来计算评分的得分。