简体   繁体   English

Java Applet卡在浏览器中加载

[英]Java Applet Stuck Loading in Browser

I am trying to get an applet to load on a webpage, but it will not load properly. 我正在尝试使applet加载到网页上,但是无法正确加载。 Here is the applet tag for the page: 这是页面的applet标签:

<applet codebase="classes" code="Simulation.class" width="600" height="600"></applet>

I've been able to get other applets loaded on the site with no problem, but this one will either do nothing, or not get past the loading screen (see yourself here ). 我已经能够毫无问题地将其他applet加载到站点上,但是该applet要么不起作用,要么不通过加载屏幕( 在此处查看您自己)。 The applet requires other classes, but they are still all under the "classes" directory, so I don't think that is the problem. 该applet需要其他类,但是它们仍然都在“ classes”目录下,因此我认为这不是问题。 Here is the code for the Simulation.java file: 这是Simulation.java文件的代码:

import java.applet.Applet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.util.ArrayList;

public class Simulation 
    extends Applet 
    implements Runnable, MouseListener, MouseMotionListener, KeyListener{

private static final long serialVersionUID = -1914559969027349635L;

private boolean threadSuspended;
private Thread t = null;
private int startX;
private int startY;
private int endX;
private int endY;

private Environment env;
private int numAgents = -1;
private int width;
private int height;
private int stepTime;
private int currentParam;
private boolean start;
private boolean instructions;

private final double START_RANGE = 70.0;
private final double START_BUFFER = 5.0;
private int speed;
private final int[] SPEEDS = {4, 5, 6, 7, 8, 
                              10, 12, 15, 18, 22, 
                              26, 30, 35, 40, 50, 
                              65, 80, 100, 150, 300};

public void init() {
    start = true;
    currentParam = 1;
    initParams();
    env = new Environment(width, height, numAgents, START_RANGE, START_BUFFER);
    env.init();
    resize(width, height);
    setBackground(Color.WHITE);
    addMouseListener(this);
    addMouseMotionListener(this);
    addKeyListener(this);
    repaint();
}

public void restart() {
    stop();
    start = true;
    double tempVD = env.getVelocityDiscount();
    double tempHD = env.getHeadingDiscount();
    env = new Environment(width, height, numAgents, env.getRange(), env.getBuffer());
    env.init();
    env.setVelocityDiscount(tempVD);
    env.setHeadingDiscount(tempHD);
    repaint();
}

private void initParams() {
    start = true;
    width = 600;
    height = 600;
    stepTime = 15;
    speed = 8;
    getNumAgents();
}

private void getNumAgents() {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    try {
        if (numAgents < 1) {
            System.out.print("Number of agents: ");
            numAgents = Integer.parseInt(reader.readLine());
        }
    }
    catch (Exception e) {
        System.err.println("Error reading input. Please enter only positive integers.");
        try {
            Thread.sleep(500);
        } catch (InterruptedException e1) {
            System.err.println("Thread interrupted.");
            System.exit(1);
        }
        getNumAgents();
    }
    if (numAgents < 1) {
        System.err.println("Error reading input. Please enter only positive integers.");
        getNumAgents();
    }
}

public void start(){
    if (t == null){
        t = new Thread(this);
        threadSuspended = false;
        t.start();
    }
    else{
        if(threadSuspended){
            threadSuspended = false;
            synchronized(this){
                notify();
            }
        }
    }
}

public void stop(){
    threadSuspended = true;
}

public void run(){
    numAgents = env.getAgents().size();
    width = env.getWidth();
    height = env.getHeight();
    try {
        stop();
        while (true) {
            if (threadSuspended){
                synchronized(this){
                    while (threadSuspended){
                        wait();
                    }
                }
            }
            if (this.getWidth() != env.getWidth() || this.getHeight() != env.getHeight()) {
                env.setWidth(this.getWidth());
                env.setHeight(this.getHeight());
            }
            env.cycle();
            repaint();
            for (int i = 0; i < stepTime / 5; i++) {
                Thread.sleep(5);
            }
        }
    }
    catch (InterruptedException e) {
        System.err.println("Runtime Error");
        e.printStackTrace();
    }
}

public void paint(Graphics g){
    g.setFont(new Font("SansSerif", Font.PLAIN, 15));
    ArrayList<Agent> agents = env.getAgents();
    for (Agent i : agents) {
        if (i.isSelected()) {
            g.setColor(Color.RED);
            g.fillOval((int) i.getX() - 2, (int) i.getY() - 2, 5, 5);
        }
        else {
            switch (i.getGroup()) {
            case 0:
                g.setColor(Color.BLACK);
                break;
            case 1:
                g.setColor(Color.BLUE);
                break;
            case 2:
                g.setColor(Color.YELLOW);
                break;
            case 3:
                g.setColor(Color.RED);
                break;
            case 4:
                g.setColor(Color.GREEN);
                break;
            case 5:
                g.setColor(Color.ORANGE);
                break;
            case 6:
                g.setColor(Color.CYAN);
                break;
            case 7:
                g.setColor(Color.PINK);
                break;
            case 8:
                g.setColor(Color.MAGENTA);
                break;
            case 9:
                g.setColor(Color.DARK_GRAY);
                break;
            }
            g.drawOval((int) i.getX() - 1, (int) i.getY() - 1, 3, 3);
        }
    }
    if (startX != -1 && startY != -1 && endX != -1 && endY != -1) {
        g.setColor(Color.LIGHT_GRAY);
        Rectangle r = getDraggedRect();
        g.drawRect((int) r.getMinX(), (int) r.getMinY(), r.width, r.height);
    }
    g.setColor(Color.LIGHT_GRAY);
    switch (currentParam) {
    case 1:
        g.drawString("Speed: " + (SPEEDS.length - speed), 2, 12);
        break;
    case 2:
        g.drawString("Sensing range: " + env.getRange(), 2, 12);
        break;
    case 3:
        g.drawString("Velocity discount: " + env.getVelocityDiscount(), 2, 12);
        break;
    case 4:
        g.drawString("Heading discount: " + env.getHeadingDiscount(), 2, 12);
        break;
    case 5:
        g.drawString("Buffer: " + env.getBuffer(), 2, 12);
        break;
    }
    if (start || instructions) {
        drawInstructions(g);
    }
}

private void drawInstructions(Graphics g) {
    Color c = new Color(50, 50, 50, 200);
    g.setColor(c);
    int startX = (width / 2) - 152;
    int startY = (width / 2) - 152;
    g.fill3DRect(startX, startY, 304, 304, true);
    g.setColor(Color.WHITE);
    g.setFont(new Font("SansSerif", Font.PLAIN, 10));
    g.drawString("Please set parameters before starting (parameters can be", startX + 3, startY + 13);
    g.drawString("altered at any time - current selected parameter is in the", startX + 3, startY + 26);
    g.drawString("upper left corner at all times):", startX + 3, startY + 39);
    g.drawString("Press 'S' to change simulation speed", startX + 3, startY + 52);
    g.drawString("Press 'R' to change sensing range", startX + 3, startY + 65);
    g.drawString("Press 'V' to change velocity discount", startX + 3, startY + 78);
    g.drawString("Press 'H' to change header discount", startX + 3, startY + 91);
    g.drawString("Press 'B' to change buffer size", startX + 3, startY + 104);
    g.drawString("Use the UP and DOWN arrow keys to alter parameters", startX + 3, startY + 117);
    g.drawString("Press the FORWARD arrow while paused to move one step", startX + 3, startY + 143);
    g.drawString("Press SPACEBAR to pause or resume", startX + 3, startY + 156);
    g.drawString("Reset the simulation by pressing ENTER", startX + 3, startY + 169);
    g.drawString("Groups:", startX + 3, startY + 195);
    g.drawString("Assign agents to any group by pressing 0-9 when selected.", startX + 3, startY + 208);
    g.drawString("CLICK on any agent to select it, or select several agents", startX + 3, startY + 221);
    g.drawString("at once by DRAGGING a selection box around them.", startX + 3, startY + 234);
    g.drawString("Agents will only cohere to others in their group, but will", startX + 3, startY + 247);
    g.drawString("still avoid collisions with all agents in the simulation.", startX + 3, startY + 260);
    g.drawString("Press SPACEBAR to begin", startX + 3, startY + 286);
    g.setFont(new Font("SansSerif", Font.ITALIC, 10));
    g.drawString("NOTE: these instructions can be brought up by pressing i", startX + 3, startY + 299);
}

private Rectangle getDraggedRect() {
    int xS;
    int width;
    int yS;
    int height;
    if (startX > endX) {
        xS = endX;
        width = startX - endX;
    }
    else {
        xS = startX;
        width = endX - startX;
    }
    if (startY > endY) {
        yS = endY;
        height = startY - endY;
    }
    else {
        yS = startY;
        height = endY - startY;
    }
    return new Rectangle(xS - 3, yS - 3, width + 7, height + 7);
}

private double roundTwo(double d) {
    DecimalFormat twoDForm = new DecimalFormat("#.##");
    return Double.valueOf(twoDForm.format(d));
}

public void mouseClicked(MouseEvent e) {}

public void mouseEntered(MouseEvent e) {}

public void mouseExited(MouseEvent e) {}

public void mousePressed(MouseEvent e) {
    stop();
    startX = e.getX();
    startY = e.getY();
}

public void mouseReleased(MouseEvent e) {
    endX = e.getX();
    endY = e.getY();
    Rectangle r = getDraggedRect();
    Point temp;
    for (Agent i : env.getAgents()) {
        temp = new Point((int) i.getX(), (int) i.getY());
        if (r.contains(temp)) {
            i.select();
        }
        else {
            i.setSelected(false);
        }
    }
    startX = -1;
    startY = -1;
    endX = -1;
    endY = -1;
    repaint();
}

public void mouseDragged(MouseEvent e) {
    endX = e.getX();
    endY = e.getY();
    repaint();
}

public void mouseMoved(MouseEvent e) {}

public void keyPressed(KeyEvent e) {
    int code = e.getKeyCode();
    switch (code) {
    case 10:
        restart();
        break;
    case 32:
        start = false;
        if (threadSuspended) {
            start();
        }
        else {
            stop();
        }
        break;
    case 39:
        if (threadSuspended && !start) {
            env.cycle();
            repaint();
        }
        break;
    case 83:
        currentParam = 1;
        repaint();
        break;
    case 82:
        currentParam = 2;
        repaint();
        break;
    case 86:
        currentParam = 3;
        repaint();
        break;
    case 72:
        currentParam = 4;
        repaint();
        break;
    case 66:
        currentParam = 5;
        repaint();
        break;
    case 65:
        env.setAllSelected();
        repaint();
        break;
    case 73:
        if (!start) {
            instructions = !instructions;
            repaint();
        }
        break;
    case 48:
        env.setSelectedGroup(0);
        break;
    case 49:
        env.setSelectedGroup(1);
        break;
    case 50:
        env.setSelectedGroup(2);
        break;
    case 51:
        env.setSelectedGroup(3);
        break;
    case 52:
        env.setSelectedGroup(4);
        break;
    case 53:
        env.setSelectedGroup(5);
        break;
    case 54:
        env.setSelectedGroup(6);
        break;
    case 55:
        env.setSelectedGroup(7);
        break;
    case 56:
        env.setSelectedGroup(8);
        break;
    case 57:
        env.setSelectedGroup(9);
        break;
    }
    switch (currentParam) {
    case 1:
        if (code == 38 && speed > 0) {
            speed--;
            stepTime = SPEEDS[speed];
            repaint();
        }
        if (code == 40 && speed < SPEEDS.length - 1) {
            speed++;
            stepTime = SPEEDS[speed];
            repaint();
        }
        break;
    case 2:
        if (code == 38 && env.getRange() < 200) {
            env.setRange(env.getRange() + 5);
            repaint();
        }
        if (code == 40 && env.getRange() > 5) {
            env.setRange(env.getRange() - 5);
            repaint();
        }
        break;
    case 3:
        if (code == 38 && env.getVelocityDiscount() < 0.99) {
            env.setVelocityDiscount(roundTwo(env.getVelocityDiscount() + 0.01));
            repaint();
        }
        if (code == 40 && env.getVelocityDiscount() > 0.00) {
            env.setVelocityDiscount(roundTwo(env.getVelocityDiscount() - 0.01));
            repaint();
        }
        break;
    case 4:
        if (code == 38 && env.getHeadingDiscount() < 0.99) {
            env.setHeadingDiscount(roundTwo(env.getHeadingDiscount() + 0.01));
            repaint();
        }
        if (code == 40 && env.getHeadingDiscount() > 0.01) {
            env.setHeadingDiscount(roundTwo(env.getHeadingDiscount() - 0.01));
            repaint();
        }
        break;
    case 5:
        if (code == 38 && env.getBuffer() < 100) {
            env.setBuffer(env.getBuffer() + 5);
            repaint();
        }
        if (code == 40 && env.getBuffer() > 0) {
            env.setBuffer(env.getBuffer() - 5);
            repaint();
        }
        break;
    }
}

public void keyReleased(KeyEvent e) {}

public void keyTyped(KeyEvent e) {}
}

Any help or suggestion as to why this is not loading properly is appreciated. 感谢您提供任何有关为什么无法正确加载的帮助或建议。 Thanks! 谢谢!

与applet一起启动Java Console,并注意异常情况。

I figured it out. 我想到了。 When the applet is initializing, it requests input from the user: 小程序初始化时,它请求用户输入:

private void getNumAgents() {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    try {
        if (numAgents < 1) {
            System.out.print("Number of agents: ");
            numAgents = Integer.parseInt(reader.readLine());
        }
    }
...

Which caused the applet to stall when running in-browser. 在浏览器中运行时,这导致小程序停止运行。 I had originally set it up this way while testing within Eclipse, and had meant to take it out before uploading. 我最初是在Eclipse中进行测试时以这种方式设置的,并打算在上载之前将其取出。

Thanks for the help though, everyone. 谢谢大家的帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM