设计一个布局管理器,显示n个裁判的评分,根据制定规则计算出最后得分。要求:图形界面采用表格(JTable)显示裁判评分;指定分数范围,若超出,则异常处理;得分规则由指定接口约定,由多个接口对象给出多种得分规则,如求平均数值,或去掉一个最高分和一个最低分后,再求平均值。
时间: 2024-05-07 18:19:05 浏览: 109
这里我提供一个Java Swing的布局管理器示例,可以显示n个裁判的评分,并且根据指定规则计算出最后得分。
首先,我们可以使用JTable来显示裁判评分。JTable是Java Swing提供的一个表格控件,可以用于显示二维数据。我们可以使用DefaultTableModel来创建表格模型,并将其设置为JTable的数据模型。以下是一个简单的示例代码:
```java
DefaultTableModel model = new DefaultTableModel(n, 2);
JTable table = new JTable(model);
```
其中,n是裁判的数量,2表示每个裁判的评分和总评分两列。
接下来,我们需要指定分数范围,并对超出范围的分数进行异常处理。我们可以在JTable的CellEditor中添加一个InputVerifier,用于验证用户输入的分数是否合法。以下是一个示例代码:
```java
DefaultCellEditor editor = new DefaultCellEditor(new JTextField()) {
@Override
public boolean stopCellEditing() {
String value = (String) getCellEditorValue();
try {
double score = Double.parseDouble(value);
if (score < 0 || score > 10) {
throw new NumberFormatException();
}
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(null, "Invalid score: " + value);
return false;
}
return super.stopCellEditing();
}
};
editor.getComponent().setInputVerifier(new InputVerifier() {
@Override
public boolean verify(JComponent input) {
JTextField field = (JTextField) input;
String value = field.getText();
try {
double score = Double.parseDouble(value);
if (score < 0 || score > 10) {
throw new NumberFormatException();
}
return true;
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(null, "Invalid score: " + value);
return false;
}
}
});
table.setDefaultEditor(Double.class, editor);
```
以上代码中,我们创建了一个DefaultCellEditor,并重写了它的stopCellEditing方法,在这个方法中验证用户输入的分数是否合法。如果分数不合法,弹出一个对话框提示用户重新输入。然后,我们将这个CellEditor设置为JTable的默认编辑器,并指定它只能编辑Double类型的数据。
最后,我们需要定义多个得分规则接口,并实现这些接口来计算最终得分。以下是一个示例代码:
```java
public interface ScoreStrategy {
double calculate(double[] scores);
}
public class AverageScoreStrategy implements ScoreStrategy {
@Override
public double calculate(double[] scores) {
double sum = 0;
for (double score : scores) {
sum += score;
}
return sum / scores.length;
}
}
public class TrimmedMeanScoreStrategy implements ScoreStrategy {
@Override
public double calculate(double[] scores) {
double sum = 0;
Arrays.sort(scores);
for (int i = 1; i < scores.length - 1; i++) {
sum += scores[i];
}
return sum / (scores.length - 2);
}
}
```
以上代码中,我们定义了一个ScoreStrategy接口,它有一个calculate方法用于计算得分。然后,我们实现了两个得分规则类:AverageScoreStrategy用于计算平均分,TrimmedMeanScoreStrategy用于去掉一个最高分和一个最低分后再计算平均分。
最后,我们在程序中使用这些接口对象来计算最终得分。以下是一个示例代码:
```java
double[] scores = new double[n];
for (int i = 0; i < n; i++) {
scores[i] = (double) table.getValueAt(i, 0);
}
ScoreStrategy strategy = new AverageScoreStrategy();
double finalScore = strategy.calculate(scores);
```
以上代码中,我们首先从JTable中获取每个裁判的得分,然后使用ScoreStrategy接口对象来计算最终得分。在这个示例中,我们使用了AverageScoreStrategy来计算平均分。如果需要使用其他得分规则,只需要将strategy对象替换成其他实现了ScoreStrategy接口的对象即可。
完整的示例代码如下:
阅读全文