Как мне открыть окно с ответами для среднего значения?

#java

Вопрос:

 import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class CirclesGUI {

private static JFrame mainFrame;
private static JPanel mainPanel, navPanel, inputPanel, buttonPanel;
private static JLabel radLabel, colLabel;
private static JTextField navField, radField, colField;
private static JButton upButton, downButton, addButton, modifyButton, saveButton, averageButton;

private static int count = 0, nav = 0;
private static Circle circles[] = new Circle[20];

public static void main(String[] args) {
    loadCircleData();
    init();
}

private static void init() {
    mainFrame = new JFrame("Circles");
    mainPanel = new JPanel(new GridLayout(3, 1));

    navPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
    downButton = new JButton("<");
    navField = new JTextField(20);
    navField.setEditable(false);
    navField.setText(circles[nav].toString());
    upButton = new JButton(">");

    navPanel.add(downButton);
    navPanel.add(navField);
    navPanel.add(upButton);

    inputPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
    radLabel = new JLabel("Radius");
    radField = new JTextField(5);
    colLabel = new JLabel("Color");
    colField = new JTextField(10);
    inputPanel.add(radLabel);
    inputPanel.add(radField);
    inputPanel.add(colLabel);
    inputPanel.add(colField);

    buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
    addButton = new JButton("Add");
    modifyButton = new JButton("Modify");
    saveButton = new JButton("Save");
    averageButton = new JButton("Average");
    saveButton.setEnabled(false);
    buttonPanel.add(addButton);
    buttonPanel.add(modifyButton);
    buttonPanel.add(saveButton);
    buttonPanel.add(averageButton);

    mainPanel.add(navPanel);
    mainPanel.add(inputPanel);
    mainPanel.add(buttonPanel);

    mainFrame.add(mainPanel);
    mainFrame.setSize(350, 300);
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainFrame.setLocationRelativeTo(null);
    mainFrame.setVisible(true);

    upButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (nav >= count - 1) {
                JOptionPane.showMessageDialog(null, "No more circles to show!");
                nav = count;
            } else
                navField.setText(circles[  nav].toString());
        }
    });

    downButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (nav <= 0) {
                JOptionPane.showMessageDialog(null, "No more circles to show!");
                nav = 0;
            } else
                navField.setText(circles[--nav].toString());
        }
    });

    addButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (count >= 20)
                JOptionPane.showConfirmDialog(null, "Array full! Maximum 20 circles reached.");
            else {
                if (radField.getText().equals("") || colField.getText().equals(""))
                    JOptionPane.showMessageDialog(null, "Please enter the circle data to add one!");
                else {
                    double radius = Double.parseDouble(radField.getText().trim());
                    String color = colField.getText().trim();
                    Circle circle = new Circle(radius, color);
                    circles[count  ] = circle;
                    nav = count - 1;
                    navField.setText(circles[nav].toString());
                    radField.setText("");
                    colField.setText("");
                    JOptionPane.showMessageDialog(null, "Circle added successfully! Number of circles = "   count   ".");
                    count  ;
                }
            }
        }
    });

    modifyButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            addButton.setEnabled(false);
            modifyButton.setEnabled(false);
            averageButton.setEnabled(false);
            saveButton.setEnabled(true);
            radField.setText(circles[nav].getRadius()   "");
            colField.setText(circles[nav].getColor());
        }
    });

    saveButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (radField.getText().equals("") || colField.getText().equals(""))
                JOptionPane.showMessageDialog(null, "Please enter the circle data to add one!");
            else {
                double rad = Double.parseDouble(radField.getText().trim());
                String col = colField.getText().trim();
                circles[nav].setRadius(rad);
                circles[nav].setColor(col);
                radField.setText("");
                colField.setText("");
                addButton.setEnabled(true);
                modifyButton.setEnabled(true);
                saveButton.setEnabled(false);
                averageButton.setEnabled(true);
                JOptionPane.showMessageDialog(null, "Changes to circle at index "   (nav   1)   " saved successfully.");
                navField.setText(circles[nav].toString());
            }
        }
    });
}

private static void loadCircleData() {
    circles[count  ] = new Circle(5, "White");
    circles[count  ] = new Circle(7, "Black");
    circles[count  ] = new Circle(9, "Gray");
    circles[count  ] = new Circle(11, "Blue");
    circles[count  ] = new Circle(13, "Red");
}

private static double getAverage() { 
    double res = 0; 
    int counter = 0;
    while (counter < count) {
        res  = circles[counter].getRadius(); 
        JOptionPane.showMessageDialog();
    }
    return res / circles.length;
    
}
 

}

Вопрос в следующем: «Создайте программу с кнопками, надписями и текстовыми полями. Эта программа должна содержать данные для кругов. Создайте массив кругов (длина 20 должна быть достаточной). Пользователь может ввести радиус и цвет круга. Там должна быть кнопка «Добавить», чтобы добавить введенный пользователем круг, кнопка «Изменить», чтобы изменить радиус и/или цвет круга, и кнопка «Среднее значение», чтобы найти средний радиус всех кругов. У вас также должен быть набор кнопок для навигации по вашему массиву кругов, отображающих текущий для пользователя в ваших текстовых полях».

Все работает, кроме последней части, где мне нужно получить ответы среднего радиуса, чтобы они появились. Не уверен, что добавить в диалоговое окно сообщения. Пожалуйста, помогите мне. Я действительно не знаю, что делать.

Ответ №1:

Это не кажется слишком сложным. Вам просто нужно будет добавить действие к вашей кнопке «Среднее значение», чтобы отобразить среднее значение следующим образом:

 averageButton.addActionListener(e -> {
    double average = getAverage();
    JOptionPane.showMessageDialog(mainFrame, "Average: "   average);
});
 

Но вам также необходимо исправить свой getAverage()-метод.
В настоящее время у вас нет рабочего условия выхода, потому что вы не увеличиваете количество.
Подведение итогов в порядке, но вы не можете разделить в конце на размер массива, так как он фиксированный и не зависит от текущего содержимого.
Вместо этого вы можете использовать счетчик, который вы увеличиваете во время итерации по массиву, так что вот так:

 private static double getAverage() { 
    double res = 0; 
    int counter = 0;
    while (counter < count) {
        res  = circles[counter].getRadius(); 
        counter  ;
        
    }
    return res / counter;
    
}
 

Вы могли бы просто подумать о замене массива кругов чем-то более динамичным, например списком, тогда вам больше не нужно проверять этот размер, и после суммирования радиусов вы действительно можете определить среднее значение, сказав

 return res / circles.size()