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) 没有做它必须做的事情[重复]的主要内容,如果未能解决你的问题,请参考以下文章