不在java小程序中绘制像素

不在java小程序中绘制像素,java,applet,awt,Java,Applet,Awt,我写的这个程序应该画一个Sierpinski三角形,但是每当我在低端计算机上用appletviewer打开它时,它通常会画4到60个点。如果我在没有重新编译的情况下重新打开它,点的数量偶尔会从通常的4点增加。在家里的高端电脑上运行它,在大约500000次迭代时效果最好。然而,虽然它绘制的形状相当完整,但它开始在不可能有点的地方绘制点。只有当数字开始变高时,才会发生这种情况。为什么我的小程序不能在低端计算机上工作,为什么它在错误的位置以更大的值绘制像素?代码如下: import java.appl

我写的这个程序应该画一个Sierpinski三角形,但是每当我在低端计算机上用appletviewer打开它时,它通常会画4到60个点。如果我在没有重新编译的情况下重新打开它,点的数量偶尔会从通常的4点增加。在家里的高端电脑上运行它,在大约500000次迭代时效果最好。然而,虽然它绘制的形状相当完整,但它开始在不可能有点的地方绘制点。只有当数字开始变高时,才会发生这种情况。为什么我的小程序不能在低端计算机上工作,为什么它在错误的位置以更大的值绘制像素?代码如下:

import java.applet.Applet;
import java.awt.*;
import java.util.Random;

public class Triangle extends Applet implements Runnable {

    Thread runner;
    Random rand = new Random();
    int xCord, yCord;
    double lastX, lastY, currentX, currentY;
    final double topX = 500, topY = 100, leftX = 200, leftY = 700,
                 rightX = 800, rightY = 700;

    public void start() {

        if (runner == null)
        {
            runner = new Thread(this);
            runner.start();
        }
    }

    public void init() {

    lastX = 500;  //Top dot
    lastY = 100;
    }   

    public void run() {

        for(int counter = 1; counter <= 5000000; counter++) {

            int n = rand.nextInt(3) + 1;

            if (n == 1) { //Top dot
                currentX = topX + (lastX - topX) / 2;
                currentY = topY + (lastY - topY) / 2;
                lastX = currentX;
                lastY = currentY;
                xCord = (int)Math.round(currentX);
                yCord = (int)Math.round(currentY);
                repaint();
            } else if (n == 2) { //Left dot
                currentX = leftX + (lastX - leftX) / 2;
                currentY = leftY + (lastY - leftY) / 2;
                lastX = currentX;
                lastY = currentY;
                xCord = (int)Math.round(currentX);
                yCord = (int)Math.round(currentY);
                repaint();
            } else { //Right dot
                currentX = rightX + (lastX - rightX) / 2;
                currentY = rightY + (lastY - rightY) / 2;
                lastX = currentX;
                lastY = currentY;
                xCord = (int)Math.round(currentX);
                yCord = (int)Math.round(currentY);
                repaint();
            }
        }
    }

    public void update(Graphics g) {

        paint(g);
    }
    public void paint(Graphics g) {

        g.fillRect(500, 100, 2, 2); //Top dot, dot 1
        g.fillRect(200, 700, 2, 2); //Bottom left dot, dot 2
        g.fillRect(800, 700, 2, 2); //Bottom right dot, dot 3
        g.fillRect(xCord, yCord, 2, 2); 
    }
}
import java.applet.applet;
导入java.awt.*;
导入java.util.Random;
公共类三角形扩展小程序实现可运行{
螺纹流道;
Random rand=新的Random();
int xCord,yCord;
双lastX,lastY,currentX,currentY;
最终双倍topX=500,topY=100,leftX=200,leftY=700,
右X=800,右Y=700;
公开作废开始(){
if(runner==null)
{
流道=新螺纹(此);
runner.start();
}
}
公共void init(){
lastX=500;//顶点
lastY=100;
}   
公开募捐{

对于(int counter=1;计数器小程序已弃用且不再受支持;您可能会向EDT发送重新绘制请求,这可能会导致问题。更好的解决方案可能是使用
缓冲图像
图像,绘制更新,然后通过
绘制
方法^^^绘制图像,如果需要,请切换到java web start。)如果你需要在页面内绘制图形,我不熟悉
buffereImage
方法,但如果我理解正确,你必须使用现有的图像?我真的不想这样做,因为我想从头开始绘制没有任何附加文件。在每次绘制事件之间添加延迟是否可以解决问题?这只是我为Fun做的一个项目,您不理解。您可以“从头开始”创建BuffereImage并将其用作背景图像。@Tuomas我将从重写开始,从概念上讲,您需要将正在进行的工作和绘制移动到它自己的上下文中,然后在每个更新周期提供一种更新UI的方法。您还需要摆脱小程序,移到实际工作的地方
<html>
<body>
<applet code = "Triangle.class" width=999 height=799>
</applet>
</body>
</html>