java setBackground第一次不起作用,但第二次起作用,为什么?
我在一本书中看到过这个例子,效果很好,但出现的唯一问题是,当clearCounter变为==5时,第一次调用绘制时背景不会变黑,然后屏幕会被清除,当绘制开始时,背景会变黑
public class apletprg extends JApplet implements ActionListener
{
int clearCounter;
Timer t;
public void init(){
setBackground(Color.black);
clearCounter = 0;
Timer t = new Timer(1000, this);
t.start();
}
public void paint(Graphics g)
{
setBackground(Color.black);
clearCounter++;
Graphics2D g2 = (Graphics2D) g;
if (clearCounter == 5){
g2.clearRect(0, 0, 500, 400);
clearCounter=0;
}
for (int i = 1; i <= 40; i++) {
Color c = chooseColor();
g2.setColor(c);
Font f = chooseFont();
g2.setFont(f);
drawJava(g2);
}
}
public void actionPerformed(ActionEvent ae){
repaint();
}
public Color chooseColor(){
int r= (int) (Math.random() * 255);
int g= (int) (Math.random() * 255);
int b= (int) (Math.random() * 255);
Color c = new Color(r,g,b);
return c;
}
public Font chooseFont(){
int fontChoice = (int) (Math.random() * 4) + 1;
Font f = null;
switch (fontChoice) {
case 1: f = new Font("Serif", Font.BOLD + Font.ITALIC, 20);break;
case 2: f = new Font("SansSerif", Font.PLAIN, 17);break;
case 3: f = new Font("Monospaced", Font.ITALIC, 23);break;
case 4: f = new Font("Dialog", Font.ITALIC, 30);break;
}
return f;
}
public void drawJava(Graphics2D g2){
int x = (int) (Math.random() * 500);
int y = (int) (Math.random() * 400);
g2.drawString("Adnan", x, y);
}
}
我知道Init()在开始时只被调用一次,但为什么它不能在开始时更改背景呢
# 1 楼答案
解决了这个问题,只需再添加一个变量,并在绘制开始时调用ClearRect(),并通过新添加的变量确保只调用一次
public void init(){
# 2 楼答案
在init方法中,将
setBackground(Color.black)
替换为getContentPane().setBackground(Color.black)
并在
paint
方法中添加super.paint(g)
作为第一行否则,如果您不想使用Swing特性,那么继续导入
java.applet.Applet
,并使您的类扩展Applet
,而不是JApplet
如果你想执行超级。paint()只需在类中添加一个布尔变量一次
在油漆中