gpt4 book ai didi

java - 为什么 paint() 方法不执行 update() 或 paint() 方法?

转载 作者:行者123 更新时间:2023-11-29 06:18:31 25 4
gpt4 key购买 nike

我遇到这个问题,当我执行 repaint() 时,类中的 paint()update() 方法没有被调用。这是代码:

public class BufferedDisplay extends Canvas implements Runnable {

// Contains all the images in order, ordered from background to foreground
private ArrayList<ImageStruct> images;
// Tracks the last insert ID of the last image for a particular layer
private TreeMap<Integer, Integer> insertIDs;
// Image that holds the buffered Image
private Image offscreen;

public BufferedDisplay() {
images = new ArrayList<ImageStruct>();
insertIDs = new TreeMap<Integer, Integer>();
}

public void addImageStruct(ImageStruct is) {
int layer = is.getLayer();
// Index to insert the image at
int index = -1;
if(insertIDs.containsKey(layer)) {
index = insertIDs.get(layer)+1;
insertIDs.put(layer, index);
}
else {
index = images.size();
insertIDs.put(layer, index);
}
if(index>-1) {
images.add(index, is);
}
}

public void run() {
try
{
while(true)
{
System.out.print("\nSleeping... ");
System.out.print("ArraySize:"+images.size()+" ");
Thread.sleep(1000);
System.out.print("Slept. ");
repaint();
}
}
catch(Exception e)
{
System.out.println("Display Error: ");
e.printStackTrace();
System.exit(-1);
}
}

// Overrides method so the background isn't automatically cleared
public void update( Graphics g )
{
System.out.print("Updating... ");
paint(g);
}

public void paint( Graphics g )
{
System.out.print("Painting... ");
if(offscreen == null)
offscreen = createImage(getSize().width, getSize().height);
Graphics buffer = offscreen.getGraphics();
buffer.setClip(0,0,getSize().width, getSize().height);
g.setColor(Color.white);
paintImages(buffer);
g.drawImage(offscreen, 0, 0, null);
buffer.dispose();
}

public void paintImages( Graphics window )
{
for(ImageStruct i : images) {
i.draw(window);
}
}
}

这个类是这样实现的:

public class Game extends JPanel{
// A reference to the C4Game class
private C4Game game;
// A reference to the BufferedDisplay class
private BufferedDisplay display;
// The Image used to initialize the game board
private Image tile;
private int tileSize = 75;
private int tileLayer = 5;
// Thread that controls animation for the BufferedDisplay
Thread animation;

public Game(C4Game game) {
this.game = game;
display = new BufferedDisplay();
try {
tile = ImageIO.read(new File("img\\tile.png"));
} catch (IOException e) {
System.out.println("ERROR: ");
e.printStackTrace();
}
((Component)display).setFocusable(true);
add(display);
animation = new Thread(display);
animation.start();
initBoard();
}

public void initBoard() {
for(int x = 0; x<game.numRows()*tileSize; x+=tileSize) {
for(int y = 0; y<game.numCols()*tileSize; y+=tileSize) {
System.out.println("Placing " +x +" " +y +"...");
display.addImageStruct(new ImageStruct(tile, tileLayer, x, y, tileSize, tileSize));
}
}
}
}

...然后在 JFrame 中实现。

public class TetraConnect extends JFrame{

public TetraConnect() {
super("TetraConnect", 800, 600);
try {
setIconImage(Toolkit.getDefaultToolkit().createImage("img/icon.png"));
ms = new MainScreen(this);
add(ms);
ms.updateUI();
C4Game c4g = new C4Game(5,6);
Game g = new Game(c4g);
add(g);
g.updateUI();
}
catch(Exception e) {
System.out.println("Init. Error: ");
e.printStackTrace();
System.exit(-1);
}
}

我运行它时的输出是:

Slept.
Sleeping... Slept.
Sleeping... Slept.
Sleeping... Slept.

等等。我也无法在 Canvas 上看到任何图像(我假设它们从来没有被绘制出来)。似乎完全跳过了重绘方法;调试语句“正在更新...”和“正在重新绘制...”从未出现。但是,重绘似乎也在执行;循环重复没有问题。为什么 repaint 方法不调用 paint() 或 update() 方法?

最佳答案

正如@camickr 在评论中指出的那样,您正在使用重量级 AWT Canvas 。您真的应该使用轻量级 Swing 组件。而不是:

public class BufferedDisplay extends Canvas implements Runnable {

我推荐:

 public class BufferedDisplay extends JPanel implements Runnable {

考虑到这个小的变化,我会做以下事情:

当覆盖组件的默认绘制时,您应该覆盖 paintComponent() 方法。

所以,而不是:

public void paint( Graphics g )
{

应该是:

protected void paintComponent( Graphics g )
{

这可能会解决您的问题。

此外,您不必重写 update() 方法。相反,只需在绘制组件方法中省略对 super.paintCompenent(g) 的调用。这应该会导致背景在默认情况下保持独立。

关于java - 为什么 paint() 方法不执行 update() 或 paint() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4136535/

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