JOptionPane - 输入对话框程序

13

编写一个程序,使用输入对话框读取三个测试成绩,每个成绩的满分为100分。程序将丢弃最低分,并在消息对话框中显示两个较高分数的平均值。

这是我已经完成的部分,但不知道接下来该怎么做,需要帮助,谢谢:

import javax.swing.JOptionPane; 

public class Average {

    public static void main (String [] args){

        String test1, test2, test3, avg;

        test1= JOptionPane.showInputDialog("Please input mark for test 1: ");

        test2= JOptionPane.showInputDialog("Please input mark for test 2: ");

        test3= JOptionPane.showInputDialog("Please input mark for test 3: ");

    }

}

请看这些技巧,它们可以帮助你入门 - 即使不能解决问题,也能让你到达提出具体问题的阶段。 - Andrew Thompson
1
这个问题/答案已经有100,000次浏览了。而我今天刚用到它。然而,它因为过于局部化而被关闭了。哈哈,好吧。 - Josh Bond
2
FYI - 当搜索“java swing input alert”的组合时,此问题是排名第2的结果。 - Nick Cardoso
无论如何都不会本地化...这是一个顶级结果! - Alex Leonardi
4个回答

16
import java.util.SortedSet;
import java.util.TreeSet;

import javax.swing.JOptionPane;
import javax.swing.JFrame;

public class Average {

    public static void main(String [] args) {

        String test1= JOptionPane.showInputDialog("Please input mark for test 1: ");

        String test2= JOptionPane.showInputDialog("Please input mark for test 2: ");

        String test3= JOptionPane.showInputDialog("Please input mark for test 3: ");

        int int1 = Integer.parseInt(test1);
        int int2 = Integer.parseInt(test2);
        int int3 = Integer.parseInt(test3);

        SortedSet<Integer> set = new TreeSet<>();
        set.add(int1);
        set.add(int2);
        set.add(int3);

        Integer [] intArray = set.toArray(new Integer[3]);
        JFrame frame = new JFrame();
        JOptionPane.showInternalMessageDialog(frame.getContentPane(), String.format("Result %f", (intArray[1] + intArray[2]) / 2.0));

    }

}

我将最后一行改为以下内容,以便在Windows 10上运行:JOptionPane.showMessageDialog(new JFrame(), String.format("结果 %f", (intArray[1] + intArray[2]) / 2.0)); - RonanOD

5
为什么要用三个不同的对话框来输入内容,为什么不在一个对话框中完成所有操作并节约时间,而不是测试用户的耐心?
你可以将所有字段添加到一个 JPanel 中,然后将该 JPanel 添加到 JOptionPane 中,以在单个对话框中添加所有内容。以下代码可以更清晰地说明:
import java.awt.*;
import java.util.*;
import javax.swing.*;

public class AverageExample
{
    private double[] marks;
    private JTextField[] marksField;
    private JLabel resultLabel;

    public AverageExample()
    {
        marks = new double[3];
        marksField = new JTextField[3];
        marksField[0] = new JTextField(10);
        marksField[1] = new JTextField(10);
        marksField[2] = new JTextField(10);
    }

    private void displayGUI()
    {
        int selection = JOptionPane.showConfirmDialog(
                null, getPanel(), "Input Form : "
                                , JOptionPane.OK_CANCEL_OPTION
                                , JOptionPane.PLAIN_MESSAGE);

        if (selection == JOptionPane.OK_OPTION) 
        {
            for ( int i = 0; i < 3; i++)
            {
                marks[i] = Double.valueOf(marksField[i].getText());             
            }
            Arrays.sort(marks);
            double average = (marks[1] + marks[2]) / 2.0;
            JOptionPane.showMessageDialog(null
                    , "Average is : " + Double.toString(average)
                    , "Average : "
                    , JOptionPane.PLAIN_MESSAGE);
        }
        else if (selection == JOptionPane.CANCEL_OPTION)
        {
            // Do something here.
        }
    }

    private JPanel getPanel()
    {
        JPanel basePanel = new JPanel();
        //basePanel.setLayout(new BorderLayout(5, 5));
        basePanel.setOpaque(true);
        basePanel.setBackground(Color.BLUE.darker());

        JPanel centerPanel = new JPanel();
        centerPanel.setLayout(new GridLayout(3, 2, 5, 5));
        centerPanel.setBorder(
            BorderFactory.createEmptyBorder(5, 5, 5, 5));
        centerPanel.setOpaque(true);
        centerPanel.setBackground(Color.WHITE);

        JLabel mLabel1 = new JLabel("Enter Marks 1 : ");
        JLabel mLabel2 = new JLabel("Enter Marks 2 : ");
        JLabel mLabel3 = new JLabel("Enter Marks 3 : ");

        centerPanel.add(mLabel1);
        centerPanel.add(marksField[0]);
        centerPanel.add(mLabel2);
        centerPanel.add(marksField[1]);
        centerPanel.add(mLabel3);
        centerPanel.add(marksField[2]);

        basePanel.add(centerPanel);

        return basePanel;
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new AverageExample().displayGUI();
            }
        });
    }
}

3

一个解决方案是使用整数数组而不是单独的 test 字符串:

您可以循环解析来自 JOptionPane.showInputDialog 的响应并将其分解为数组的各个元素。

Arrays.sort 可用于对它们进行排序,以便您可以挑选出其中最高的 2 个值。

然后可以通过将这两个值相加并除以 2 来轻松计算平均值。

int[] testScore = new int[3];

for (int i = 0; i < testScore.length; i++) {
   testScore[i] = Integer.parseInt(JOptionPane.showInputDialog("Please input mark for test " + i + ": "));
}

Arrays.sort(testScore);
System.out.println("Average: " + (testScore[1] + testScore[2])/2.0);

2

接下来你需要解析结果。 假设结果是整数,那么

int testint1 = Integer.parse(test1);

同样地,其他内容应该被解析。现在可以使用if语句检查它们中是否有两个更高的分数。然后计算平均值。


当有三个数字时,如何编写if语句,因为你不能写成if (test3<test2 and test3<test1) {。 - user1733283
你可以这样写:如果(test3<test2 && test3<test1) { 如果(test2<test1) { // 这意味着test3和test2更大 } else { // 这意味着test1和test3更大 } } - greatmajestics
如果我不想使用 &&,我还能用什么方式来解决这个问题? - user1733283
然后一步一步地移动。如果(test3>test1)且(test3>test2),那么它意味着test3是最大的。现在在同一层次结构中搜索下一个最大的数字。或者只需使用以下示例,在降序排列的数组中将最顶部放在数组的顶部。 - greatmajestics

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接