Java repaint()混淆
我有一个程序,可以打开一个窗口,快速改变背景颜色,随机弹出矩形和椭圆。我的代码可以工作,但我不知道为什么,因为我没有在代码中调用repaint()函数。当我使用personal update()函数包含repaint()函数时,我没有看到任何明显的变化。这是我的密码:Java repaint()混淆,java,jframe,jpanel,Java,Jframe,Jpanel,我有一个程序,可以打开一个窗口,快速改变背景颜色,随机弹出矩形和椭圆。我的代码可以工作,但我不知道为什么,因为我没有在代码中调用repaint()函数。当我使用personal update()函数包含repaint()函数时,我没有看到任何明显的变化。这是我的密码: package epilepsy; import java.awt.Color; import java.awt.Graphics; import java.awt.BorderLayout; import javax.swi
package epilepsy;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import Math.Math;
/**
*
* @author 21psuby
*/
public class Epilepsy {
JFrame frame;
DrawPanel drawPanel;
Math math = new Math();
int screenW = 800;
int screenH = 700;
int red = math.random(0, 255);
int green = math.random(0, 255);
int blue = math.random(0, 255);
int x = math.random(0, screenW);
int y = math.random(0, screenH);
int w = math.random(0, screenW/2);
int h = math.random(0, screenH/2);
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
new Epilepsy().go();
}
private void go() {
frame = new JFrame();
drawPanel = new DrawPanel();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
frame.setVisible(true);
frame.setSize(screenW, screenH);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
}
class DrawPanel extends JPanel {
private static final long serialVersionUID = 1L;
public void paintComponent(Graphics g) {
randomize();
frame.setBackground(new Color(red, green, blue));
randomize();
g.setColor(new Color(red, green, blue));
g.fillRect(x, y, w, h);
randomize();
g.setColor(new Color(red, green, blue));
g.fillRect(x, y, w, h);
randomize();
g.setColor(new Color(red, green, blue));
g.fillRect(x, y, w, h);
randomize();
g.setColor(new Color(red, green, blue));
g.fillOval(x, y, w, h);
randomize();
g.setColor(new Color(red, green, blue));
g.fillOval(x, y, w, h);
randomize();
g.setColor(new Color(red, green, blue));
g.fillOval(x, y, w, h);
}
}
private void randomize() {
red = math.random(0, 255);
green = math.random(0, 255);
blue = math.random(0, 255);
x = math.random(0, screenW);
y = math.random(0, screenH);
w = math.random(0, screenW/2);
h = math.random(0, screenH/2);
}
private void update() {
while (true) {
try {
Thread.sleep(10);
} catch (Exception e) {
e.printStackTrace();
}
frame.repaint();
}
}
}
谢谢,Pranav方法setBackground在内部某处导致框架重新绘制自身,这将再次调用paintComponent,并再次调用setBackground。这将创建无限循环。拆下立根盒接地线,应能正常工作。如果要更改面板的背景,请尝试将其设置在paintComponent方法之外,或在整个面板上绘制所需颜色的矩形。您的程序中从未使用过更新方法。当我把它添加到go方法的末尾时,我看到了一帧癫痫发作的形状。问题是,即使我使用更新方法,也没有任何变化。这个程序不管用哪种方式都能运行,我想知道为什么。我不明白你的问题是什么。您希望从这个给定的代码中得到什么输出?+1,更一般地说:在
paintComponent
中,除了绘制组件外,不要做任何事情。该方法称为paintComponent
,而不是paintComponent和dosomerandomotherstuff
。特别是,不要更改组件的状态(因为它可能会触发重新绘制)。谢谢,这很有意义。