gpt4 book ai didi

java - Repaint() 只工作了一半

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:10:09 26 4
gpt4 key购买 nike

我对应该是一个简单的练习有疑问。我被要求制作一个打印绿色椭圆形(填充)的小程序,该椭圆形在到达边界之前变大,然后开始变小。这应该一直持续到您关闭小程序为止。

好吧,我想出了这段代码

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JApplet;

public class Disco extends JApplet{

private int x;
private int y;
private int r;
private boolean enlarge;
MakeLarger makeLarger;
MakeSmaller makeSmaller;

public void init() {}

public void start() {
x = getWidth()/2;
y = getHeight()/2;
r = 50;
enlarge = true;
makeLarger = new MakeLarger();
makeLarger.start();
}

public void paint(Graphics g) {
g.setColor(Color.GREEN);
g.fillOval(x - r, y- r, r*2, r*2);
}

public void update() {
if(enlarge) {
makeLarger = new MakeLarger();
makeLarger.start();
} else {
makeSmaller = new MakeSmaller();
makeSmaller.start();
}
}


private class MakeLarger extends Thread {

public void run() {
while(true) {
x = getWidth()/2;
y = getHeight()/2;

if(getWidth() > getHeight()) {
if(r < getHeight()/2) {
r++;
repaint();
try {
sleep(25);
} catch(InterruptedException e) {
e.printStackTrace();
}
} else {
enlarge = false;
update();
Thread.currentThread().interrupt();
return;
}
} else {
if(r < getWidth()/2) {
r++;
repaint();
try {
sleep(25);
} catch(InterruptedException e) {
e.printStackTrace();
}
} else {
enlarge = false;
update();
Thread.currentThread().interrupt();
return;
}
}
}
}

}
private class MakeSmaller extends Thread {

public void run() {
while(true) {
x = getWidth()/2;
y = getHeight()/2;

if(r > 50) {
r--;
repaint();
revalidate();
try {
sleep(25);
} catch(InterruptedException e) {
e.printStackTrace();
}
} else {
enlarge = true;
update();
Thread.currentThread().interrupt();
return;
}
}

}

}
}

当我启动我的小程序时,椭圆开始正确增长,直到它到达边界然后突然停止。

我首先想到的是它没有正确变小。但是一点 System.out.println 的工作告诉我所有的计算都在正确进行,问题是小程序只在 makeLarger 线程处于 Activity 状态时才重绘,当 makeSmaller 线程在工作时,对 repaint() 的调用不会工作!如果我在 makeSmaller Thread 工作时调整小程序窗口的大小,它会正确地重新绘制,显示椭圆变小。

有人可以启发我了解这种奇怪的行为吗?我错过了什么?

非常感谢大家的帮助,如果我的英语很差,我深表歉意!

最佳答案

我不能说我已经查看了所有代码,但有几点建议:

  • 在 JPanel 的 paintComponent 覆盖中绘制。
  • 这是关键:在覆盖的第一行调用 super.paintComponent 方法。这消除了先前的图像,使图像可以变小。
  • 通过将 JPanel 添加到 applet 来在 JApplet 中显示它。
  • 我自己会为动画循环使用单个 Swing 计时器,并会使用 boolean 值来决定调整大小的方向。
  • 但无论我使用的是 Swing 计时器还是放置在线程中的 Runnable,我都会尽量保持简单,这意味着使用一个改变调整大小方向的计时器或一个 Runnable/根据 boolean 值更改大小调整大小的线程。您正在执行的这种线程交换只会使事情过度和不必要地复杂化,并且很可能是错误的根源。
  • 作为附带建议,您几乎永远不想扩展 Thread。更好的方法是创建实现 Runnable 的类,然后当您需要在后台线程中运行它们时,创建一个线程,将您的 Runnable 传递到线程的构造函数中,然后调用 start()线程。

关于java - Repaint() 只工作了一半,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32019189/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com