由于某种原因,当我尝试对Java小程序进行双缓冲时,即使我没有告诉它,它也会显示一个白色正方形。另外,如果我尝试在start()中放入循环,即使repaint()位于末尾,我也只会得到白屏。

/**
* @(#)vo4k.java
*
* vo4k Applet application
*
* @author William Starkovich
* @version 1.00 2009/2/21
*/

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.awt.image.*;

public class vo4k extends Applet implements KeyListener
{
obj p1, e1;
boolean[] keys;
boolean end = false;
Graphics g2d;
Dimension size;
Image buf;

public void init()
{
    keys = new boolean[256];

    for(int i = 0; i < 256; i++)
        keys[i] = false;

    addKeyListener(this);
    p1 = new obj();
    p1.x = 0;

    size = getSize();
    buf = createImage(size.width,size.height);
    g2d = buf.getGraphics();
}

public void keyTyped(KeyEvent e) {}
public void keyPressed(KeyEvent e) {keys[e.getKeyCode()] = true;}
public void keyReleased(KeyEvent e) {keys[e.getKeyCode()] = false;}
public void controls()
{
    if(keys[KeyEvent.VK_SPACE])
        end = true;

    if(keys[KeyEvent.VK_W])
        p1.x += 10;

}

public void start()
{
//  while(!end)
//  {


//  }
}

public void paint(Graphics g)
{

    controls();
    //g2d = (Graphics2D) g;
    g2d.setColor(Color.RED);
    g2d.fillRect(0,0,size.width,size.height);
    g2d.setColor(Color.BLUE);
    g2d.drawString("Welcome 2 Java!!", (int) 50, 60 );
    //g2d.drawString("Welcome to Java!!", (int) p1.x, 60 );


    g.drawImage(buf, 0, 0, this);
    repaint();
}
}

class obj
{
    double x,y,l,a,s;
}

最佳答案

在涂漆方法中检查尺寸。如果尺寸已更改,请创建一个新图像,然后绘制到该图像上,并存储新的尺寸信息。另外,不要调用重绘,因为您只是递归地进行绘制。

如果在start方法中放置了一个无休止的循环,则该线程永远不会退出start方法。

public void paint(Graphics g)
{

        controls();
        Dimension currentSize  = getSize();
        if ( ! currentSize.equals(size) ) {
          size = currentSize;
          buf = createImage(size.width,size.height);
          g2d = buf.getGraphics();
        }
        //g2d = (Graphics2D) g;
        g2d.setColor(Color.RED);
        g2d.fillRect(0,0,size.width,size.height);
        g2d.setColor(Color.BLUE);
        g2d.drawString("Welcome 2 Java!!", (int) 50, 60 );
        //g2d.drawString("Welcome to Java!!", (int) p1.x, 60 );


        g.drawImage(buf, 0, 0, this);

}

关于java - Java Applet双缓冲区故障(和循环故障),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/575038/

10-11 02:34
查看更多