Java applet似乎是双重提示

时间:2011-05-09 00:24:41

标签: java applet double prompt

当我运行一个java applet(一个基本的小猜数游戏)时,每当它提出一个问题时,无论是/否,或者其他问题,它会询问前几个问题,并对结果做标准程序,然后打开下一个问题并重新打开上一组问题。这种情况持续了很长一段时间,直到你关闭html文件才会停止。我希望能够看到我的游戏是否真的有效,并且可能会玩它,尽管它很简单。任何人都可以帮忙解决这个问题吗?

完整的代码,但前几个问题是问题的真正来源。

import java.applet.Applet;
import java.awt.Graphics;
import javax.swing.JOptionPane;
import java.util.Random;

public class HelloWorld extends Applet {

    public void paint(Graphics g) {

        g.drawString ("James mylastname", 50, 25);
        String ans1 = JOptionPane.showInputDialog("Please input a value");
        String ans2 = JOptionPane.showInputDialog("Please input another value");
        String ans3 = JOptionPane.showInputDialog("Please input a final value");
        double ans1double = Double.parseDouble(ans1);
        double ans2double = Double.parseDouble(ans2);
        double ans3double = Double.parseDouble(ans3);
        double total = ans1double+ans2double+ans3double;
        double average = total/3;
        String answer = Double.toString (average);
        g.drawString ("The average of these three numbers is " + answer, 50, 50);

        Random generator = new Random();
        int x = generator.nextInt(100);
        x++;
        int i;
        // attribute names should be firstWordLowerCase
        int Prime = 5;
        for (i=2; i < x ;i++ ) {
            int n = x%i;
            if (n==0) {
                Prime = 1;
            } else {
                Prime = 0;
            }
        }

        g.drawString ("A random number has been generated, from 0 to 100. " +
            "Follow the dialogue boxes to guess the number. You have three " +
            "chances, and three hints.", 50, 75);
        int even;
        even = JOptionPane.showConfirmDialog(this, "Do you think the number is even?");
        if (even == 0) {
            if (x%2 == 0) {
                g.drawString ("Yes, this number is even.", 50,75);
            }
            if (x%2 != 0) {
                g.drawString ("No, this number is not even.", 50,75);
            }
        }

        if (even == 1) {
            if (x%2 == 0) {
                g.drawString ("Incorrect. This number is even.", 50,75);
            }
            if (x%2 != 0) {
                g.drawString ("Correct. This number is not even.", 50,75);
            }
        }

        // very bad idea to name one attribute 'Prime' and another 'prime'
        int prime;
        prime = JOptionPane.showConfirmDialog(this, "Do you think the number is prime?");
        if (prime == 0) {
            if (Prime == 1) {
                g.drawString ("Sorry, the number is not prime.", 50, 100);
            }
            if (Prime == 0) {
                g.drawString ("Correct, the number is prime.", 50, 100);
            }
        }

        if (prime == 1) {
            if (Prime == 1) {
                g.drawString ("Correct, the number is prime.", 50, 100);
            }
            if (Prime == 0) {
                g.drawString ("Sorry, the number is not prime.", 50, 100);
            }
        }

        int moreless;
        moreless = JOptionPane.showConfirmDialog(this, "Do you think the number is 50 or lower?");
        if (moreless == 0) {
            if (x <= 50) {
                g.drawString ("Correct. The number is 50 or less.", 50, 125);
            }
            if (x > 50) {
                g.drawString ("Incorrect. The number is higher than 50.", 50, 125);
            }
        }

        if (moreless == 1) {
            if (x<= 50) {
                g.drawString ("Incorrect. The number is lower than 50.", 50, 125);
            }
            if (x > 50) {
                g.drawString ("Correct. The number is higher than 50.", 50, 125);
            }
        }

        String guess1 = JOptionPane.showInputDialog("Please guess what you think the number is.");
        double guess1double = Double.parseDouble(guess1);
        if (guess1double == x) {
            g.drawString ("Correct! You guessed the number!", 50, 150);
            return;
        }
        if (guess1double != x) {
            g.drawString ("Incorrect! Please guess again, you have two more tries!", 50, 150);
        }

        String guess2 = JOptionPane.showInputDialog("Please guess again.");
        double guess2double = Double.parseDouble(guess2);
        if (guess2double == x) {
            g.drawString ("Correct! You guessed the number!", 50, 175);
            return;
        }

        if (guess2double != x) {
            g.drawString ("Incorrect! Please guess again, you have one more try!", 50, 150);
        }

        String guess3 = JOptionPane.showInputDialog("Please guess again.");
        double guess3double = Double.parseDouble(guess3);
        if (guess3double == x) {
            g.drawString ("Correct! You guessed the number!", 50, 200);
            return;
        }

        if (guess3double != x) {
            g.drawString ("Incorrect! Sorry, that was your last guess!", 50, 200);
        }
    }
}

3 个答案:

答案 0 :(得分:2)

将代码中那些只需要执行一次的部分放在init()方法中的正确位置。

DemoApplet.java

// <applet code='DemoApplet' width='400' height='400'></applet>
import java.applet.Applet;

public class DemoApplet extends Applet {

    @Override
    public void init() {
        System.out.println("init() once only at start-up");
    }

    @Override
    public void start() {
        System.out.println("start() potentially many times " +
            "(e.g. each time restored from minimized)");
    }

    @Override
    public void stop() {
        System.out.println("stop() potentially many times " +
            "(e.g. each time minimized)");
    }

    @Override
    public void destroy() {
        System.out.println("destroy() once only at shut down");
    }
}

示例I / O

prompt>appletviewer DemoApplet.java
init() once only at start-up
start() potentially many times (e.g. each time restored from minimized)
stop() potentially many times (e.g. each time minimized)
start() potentially many times (e.g. each time restored from minimized)
stop() potentially many times (e.g. each time minimized)
start() potentially many times (e.g. each time restored from minimized)
stop() potentially many times (e.g. each time minimized)
destroy() once only at shut down

答案 1 :(得分:1)

您的paint方法中有UI创建代码,每秒多次调用以呈现小程序视图。这就是原因。您需要将该代码移动到init方法,该方法被调用一次。

http://www.java2s.com/Code/Java/Swing-JFC/DemonstrationofAppletMethods.htm

http://www.cafeaulait.org/course/week5/28.html

答案 2 :(得分:-1)

问题是您有代码在paint()方法中提示用户。 AWT会根据需要多次调用该方法来绘制applet的内容。相反,将此代码移动到一个单独的方法中,您知道该方法只会被调用一次。一个好的候选人是Applet.start()