Thread.sleep(x) 没有做它必须做的事情[重复]

Posted

技术标签:

【中文标题】Thread.sleep(x) 没有做它必须做的事情[重复]【英文标题】:Thread.sleep(x) doesnt do what it has to do [duplicate] 【发布时间】:2014-01-10 13:04:17 【问题描述】:

我为一个可以在所有枢轴上打开的立方体编写了一个代码。 现在我尝试使用 Thread.sleep 进行循环,但每次重新绘制时它只会给我半个立方体或什么都没有(它有点闪烁和步履蹒跚)。

也许它不起作用,因为我的笔记本电脑太慢了,但我不认为是这种情况。

代码如下:

import java.awt.*;
import javax.swing.*;

public class Würfel1 extends JApplet 

Container container;
Dimension Screen = new Dimension(400,400);
double c[] = new double[8];
double wx = 90; double wy = 90; double wz = 90;

public Würfel1() 
    init();


public void init() 
    this.setSize(Screen);
    container = this.getContentPane();


public void paint(Graphics g) 
    super.paint(g);
    drawcube(g);
    wx = wx - 2;
    wy = wy + 1;
    wz = wz + 3;

    try Thread.sleep(100); catch (InterruptedException e) e.printStackTrace();

    repaint();


private void drawcube(Graphics g) 
    /*
     * Punkt links oben vorne
     */
    int xStart = 100;
    int yStart = 100;

    /*
     * Breite, Höhe und Länge des Körpers
     */
    int b = 200;
    int h = 200;
    int l = 200;

    /*
     * Winkel der X-, Y- und Z-Achse des Körpers
     */
//      int wx = 90;
//      int wy = 90;
//      int wz = 90;

    /*
     * Mittelpunkt des Körpers
     */
    int x = xStart + b/2;
    int y = yStart + h/2;

    /*
     * erzeugt die Grundwerte für den Winkel 90,90,90
     */
    double xfield[] = (-b/2),(b/2),(b/2),(-b/2),(-b/2),(b/2),(b/2),(-b/2);
    double yfield[] = (-h/2),(-h/2),(h/2),(h/2),(-h/2),(-h/2),(h/2),(h/2);
    double zfield[] = (l/2),(l/2),(l/2),(l/2),(-l/2),(-l/2),(-l/2),(-l/2);

    /*
     *  verändert die Werte unter Berücksichtigung der Winkel
     */
    for (int i = 0; i < 8; i++)
    
        double newx,newy,newz;

        newy = yfield[i] * Math.cos(Math.PI*(90-wx)/180) - zfield[i] * Math.sin(Math.PI*(90-wx)/180);
        newz = yfield[i] * Math.sin(Math.PI*(90-wx)/180) + zfield[i] * Math.cos(Math.PI*(90-wx)/180);
        yfield[i] = newy;
        zfield[i] = newz;

        newx = xfield[i] * Math.cos(Math.PI*(90-wy)/180) - zfield[i] * Math.sin(Math.PI*(90-wy)/180);
        newz = xfield[i] * Math.sin(Math.PI*(90-wy)/180) + zfield[i] * Math.cos(Math.PI*(90-wy)/180);
        xfield[i] = newx;
        zfield[i] = newz;

        newx = xfield[i] * Math.cos(Math.PI*(90-wz)/180) - yfield[i] * Math.sin(Math.PI*(90-wz)/180);
        newy = xfield[i] * Math.sin(Math.PI*(90-wz)/180) + yfield[i] * Math.cos(Math.PI*(90-wz)/180);
        xfield[i] = newx;
        yfield[i] = newy;
    

    for (int i = 0; i < 8; i++) 
        c[i] = 1;
    

    /*
     * Malt die Linien des Körpers
     */
    DrawPolygon(0,1,2,3,xfield,yfield,x,y,g,1);
    DrawPolygon(6,5,4,7,xfield,yfield,x,y,g,2);
    DrawPolygon(5,1,0,4,xfield,yfield,x,y,g,3);
    DrawPolygon(3,2,6,7,xfield,yfield,x,y,g,4);
    DrawPolygon(2,1,5,6,xfield,yfield,x,y,g,5);
    DrawPolygon(4,0,3,7,xfield,yfield,x,y,g,6);



public void DrawPolygon(int a, int s, int d, int f, double[] xfield, double yfield[],int b,int h,Graphics g,int c) 
    if((xfield[a] - xfield[s]) * (yfield[d] - yfield[s])
              - (yfield[a] - yfield[s]) * (xfield[d] - xfield[s]) > 0) 
                // |j->i x j->k| > 0

                int xCoords[] = (int)(xfield[a])+b,(int)(xfield[s])+b,
                                 (int)(xfield[d])+b,(int)(xfield[f])+b;
                int yCoords[] = (int)(yfield[a])+h,(int)(yfield[s])+h,
                                 (int)(yfield[d])+h,(int)(yfield[f])+h;
                Color color = new Color(0,0,0);
                if (c == 1) color = new Color(255,0,0);
                if (c == 2) color = new Color(255,255,0);
                if (c == 3) color = new Color(0,255,0);
                if (c == 4) color = new Color(0,255,255);
                if (c == 5) color = new Color(0,0,255);
                if (c == 6) color = new Color(255,0,255);

                g.setColor(color);
                g.fillPolygon(xCoords, yCoords, 4);
    


public static void main(String[] args) 
    new Würfel1();


我使用了这个想法,因为我在另一个代码中看到了它,但是多边形是用一个名为缓冲区的图像绘制的(我真的不知道这是什么) 我也使用 JApplet,因为它比我添加 JPanel 的 JFrame 更易于使用。

我最近的尝试是将 try [...] catch [...] 代码替换为

        ActionListener action = new ActionListener() 
        public void actionPerformed(ActionEvent e) 
            repaint();
        
    ;
    new Timer(100,action).start();

但由于某种原因,它只是加快了我的小程序的速度,但仍然存在我遇到的问题。 我已经在其他问题中读到他们遇到了类似的问题,但我没有找到解决我的方法来使用这个问题的答案。

我现在改变了正常的 draw[...] 并将我的立方体放在图像上: ... first 在 drawcube 方法中位于顶部

    // Double-Buffering
    if (buffer==null) 
        buffer=createImage(this.getSize().width, this.getSize().height);
        gBuffer=(Graphics2D)buffer.getGraphics();
    
    gBuffer.clearRect(0,0, this.getSize().width, this.getSize().height);

    // Antialiasing
    gBuffer.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);

...下一个引号设置在drawcube的末尾

    g.drawImage(buffer,0,0,this);

...我还必须更改 fillPoly 方法(这很明显)

                gBuffer.setColor(color);
                gBuffer.fillPolygon(xCoords, yCoords, 4);

...我在 init 方法中放置了一个计时器 - 现在它几乎可以正常工作了

public void init() 
    this.setSize(Screen);
    ActionListener action = new ActionListener() 
        public void actionPerformed(ActionEvent e) 
            repaint();
        
    ;
    new Timer(100,action).start();

【问题讨论】:

"Thread.sleep" 做了它应该做的事,相信我。我建议你看看其余的代码。 另外,你应该重写paintComponent(),而不是paint()。 值得注意的是,Thread.sleep() 没有损坏。 那么当它不是 Thread.sleep() .... 那么是什么导致了这个问题呢? 此外,您还需要稍微锻炼和提高您的 Google 技能。在Swing Thread sleep 上进行简单搜索将为您提供所需的所有信息。当前的前四次点击是针对 *** 网站,1、2、3、4,每一次点击都会给您提供与您在下面收到的相同的答案。 【参考方案1】:

不要:

    在绘画方法中使用 Thread.sleep()。这将阻塞 Event Dispatch Thread 并阻止 Swing 响应事件

    在painting() 方法中调用repaint()。这将导致无限循环

    为自定义绘画覆盖paint()。 Custom Painting 是通过覆盖 JPanel(或 JComponent)的 paintComponent(...) 方法来完成的。然后将面板添加到小程序中。

做:

    使用Swing Timer 安排动画。

【讨论】:

我想要一个无限循环。我刚刚尝试了一个swingtimer,它开始绘制自己的速度越来越快,你能给我一个例子,说明如何在我的代码中正确使用它吗? @user3126212:如果您遇到这种行为,那么您做错了什么,可能是在计时器内堆叠方法调用或添加多个计时器。请不要要求我们为您编写代码或更改您的代码。而是向我们展示您的最新代码,作为对原始问题底部的编辑,并相当详细地描述您的程序的不当行为。让我们帮助您处理您的代码。 也许,这个问题及其答案进一步澄清了事情:***.com/questions/15264373/… @SamTiba,重读don't 点。你似乎没有改变任何东西。 Timer 应该从 init() 方法开始,而不是绘画方法。 @camickr 就这样???严重地?难道你就不能写出来帮助我吗?它仍然在闪烁,但比以前少了……我的意思是……我可以读“不要”,只要我能——如果里面没有答案,那我该怎么办?说“在 init 方法中放置一个计时器”就足够了,不过谢谢

以上是关于Thread.sleep(x) 没有做它必须做的事情[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Thread.sleep(x) 或 wait() 时出现异常

Android:Thread.sleep 没有结束

替代 Thread.Sleep

Windows 8 dns 主机文件没有做它应该做的事情

C++11 对 Unicode 的支持程度如何?

为啥我必须将每个 Thread.sleep() 调用包装在 try/catch 语句中? [复制]