使用Java Swing平均成绩

我有一份我编写的家庭作业。 我以为我已经完成了,但每当我想显示平均值时,它会在内容窗格中显示0的列表。

以下是作业的说明。

编写一个Swing程序,声明一个空的数组,最大长度为50.在while循环中实现一个JOptionPane输入框,允许用户输入成绩。 当用户输入-1的sentinel值时,这将指示数据输入循环的结束。

输入成绩后,内容窗格应显示从最低到最高排序的成绩。 编写一个遍历数组的循环,查找大于零(0)的元素。 保持这些项目的运行计数,并将它们累积到总计中。 将总计除以输入的等级数来查找平均值,并在排序的等级列表的末尾显示平均值。 使用DecimalFormat方法将平均值显示为2位小数。

/* Chapter 7: Average of grades Programmer: Date: Filename: Averages.java Purpose: To use the Java Swing interface to calculate the average of up to 50 grades. Average is calculated once -1 is entered as a value. The grades are then sorted from lowest to highest and displayed in a content pane which also displayes the average. */ import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.text.*; import java.text.DecimalFormat; public class Averages extends JFrame { //construct conponents static JLabel title = new JLabel("Average of Grades"); static JTextPane textPane = new JTextPane(); static int numberOfGrades = 0; static int total = 0; static DecimalFormat twoDigits = new DecimalFormat ("##0.00"); //set array static int[] grades = new int[50]; //create content pane public Container createContentPane() { //create JTextPane and center panel JPanel northPanel = new JPanel(); northPanel.setLayout(new FlowLayout()); northPanel.add(title); JPanel centerPanel = new JPanel(); textPane = addTextToPane(); JScrollPane scrollPane = new JScrollPane(textPane); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scrollPane.setPreferredSize(new Dimension(500,200)); centerPanel.add(scrollPane); //create Container and set attributes Container c = getContentPane(); c.setLayout(new BorderLayout(10,10)); c.add(northPanel,BorderLayout.NORTH); c.add(centerPanel,BorderLayout.CENTER); return c; } //method to add new text to JTextPane public static JTextPane addTextToPane() { Document doc = textPane.getDocument(); try { // clear previous text doc.remove(0,doc.getLength()); //insert title doc.insertString(0,"Grades\n",textPane.getStyle("large")); //insert grades and calculate average for(int j=0; j<grades.length; j++) { doc.insertString(doc.getLength(), grades[j] + "\n", textPane.getStyle("large")); } } catch(BadLocationException ble) { System.err.println("Couldn't insert text"); } return textPane; } //method to sort array public void grades(int grdArray[]) { //sort int array for (int pass = 1; pass<grdArray.length; pass++) { for (int element = 0; element<grdArray.length -1; element++) { swap(grades, element, element + 1); } } addTextToPane(); } //method to swap elements of array public void swap(int swapArray[], int first, int second) { int hold; hold = swapArray[first]; swapArray[first] = swapArray[second]; swapArray[second] = hold; } //execute method at run time public static void main(String args[]) { JFrame.setDefaultLookAndFeelDecorated(true); Averages f = new Averages(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //accept first grade int integerInput = Integer.parseInt(JOptionPane.showInputDialog(null, "Please enter a grade (0-100) or -1 to calculate the average")); //while loop accepts more grades, keeps count, and calulates the total int count = 0; int[] grades = new int[50]; int num = 0; while (count<50 && num!= -1) { num = Integer.parseInt(JOptionPane.showInputDialog(null, "Please enter a grade (0-100) or -1 to calculate the average" + (count+1))); if(num!=-1) grades[count] = num; count++; } //create content pane f.setContentPane(f.createContentPane()); f.setSize(600,375); f.setVisible(true); } } 

请解决问题。

从统计数据开始:

 /** * Statistics * @author Michael * @link http://stackoverflow.com/questions/15626262/averaging-grades-using-java-swing?noredirect=1#comment22167503_15626262 * @since 3/25/13 7:50 PM */ public class Statistics { public static double getAverage(int numValues, int [] values) { double average = 0.0; if ((values != null) && (numValues > 0) && (values.length >= numValues)) { for (int i = 0; i < numValues; ++i) { average += values[i]; } average /= numValues; } return average; } } 

接下来我建议你将Swing完全抛弃一段时间。 执行纯文本输入/输出UI。

 import java.util.Scanner; /** * StatisticsDriver * @author Michael * @link http://stackoverflow.com/questions/15626262/averaging-grades-using-java-swing?noredirect=1#comment22167503_15626262 * @since 3/25/13 7:50 PM */ public class StatisticsDriver { public static final int MAX_VALUES = 50; public static void main(String [] args) { int [] values = new int[MAX_VALUES]; Scanner scanner = new Scanner(System.in); boolean getAnotherValue; int numValues = 0; do { System.out.print("next value: "); String input = scanner.nextLine(); if (input != null) { values[numValues++] = Integer.valueOf(input.trim()); } System.out.print("another? [y/n]: "); input = scanner.nextLine(); getAnotherValue = "y".equalsIgnoreCase(input); } while (getAnotherValue); System.out.println(Statistics.getAverage(numValues, values)); } } 

现在有了这些,请将注意力转向Swing。

在解决问题之前,太多的年轻程序员在Swing上缠绕在轴上。 不要犯那个错误。

你有两次声明的grades数组。 一次在main() ,第二次在全局范围内。 当您要求用户输入其成绩时,您可以在main()为arrays分配各种位置。 但是,当您在addTextToPane()获取信息时,将调用全局声明的grades数组。

删除main()的以下内容后,问题就解决了。

int[] grades = new int[50];

嗯,我能看到的第一个错误是:

您隐藏了main中的静态数组成绩

int [] grades = new int [50];