有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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()在开始时只被调用一次,但为什么它不能在开始时更改背景呢


共 (2) 个答案

  1. # 1 楼答案

    解决了这个问题,只需再添加一个变量,并在绘制开始时调用ClearRect(),并通过新添加的变量确保只调用一次

    public void init(){

        setBackground(Color.black);
        clearCounter = 0;
    
        Timer t = new Timer(1000, this);
        t.start();
        check = 0;   <       New Variable
    
    
    }
    public void paint(Graphics g)
    {
        if (check==0){
            g.clearRect(0, 0, 500, 400);   <       To Ensure That it will Excute Only Once , beacuse check is incremented later in Code
        }
    
    
    
        clearCounter++;
        check++;
        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);
            }
    }
    
  2. # 2 楼答案

    在init方法中,将setBackground(Color.black)替换为getContentPane().setBackground(Color.black)

    并在paint方法中添加super.paint(g)作为第一行

    否则,如果您不想使用Swing特性,那么继续导入java.applet.Applet,并使您的类扩展Applet,而不是JApplet

    public class NewClass extends JApplet implements ActionListener {
    
        int clearCounter;
        Timer t;
    
    
    
        public void init() {
    
            getContentPane().setBackground(Color.black);
            repaint();
            clearCounter = 0;
            //t = new Timer("1000", true);
    
    
        }
    
        public void paint(Graphics g) {
            super.paint(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);
            }
        }
        @Override
        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);
        }
    }
    

    如果你想执行超级。paint()只需在类中添加一个布尔变量一次

    boolean firstTime = true;
    

    在油漆中

    if(firstTime) {
        super.paint(g);
        firstTime = false;
    }