gpt4 book ai didi

java - Java 中的双缓冲

转载 作者:行者123 更新时间:2023-11-30 05:12:43 30 4
gpt4 key购买 nike

我在程序中实现 DoubleBuffer 时遇到一些问题。在你被文字墙晕倒之前,你应该知道其中有很多内容是为了以防万一你需要知道。我认为我遇到问题的实际地方是在一种方法中。

我最近在 gpwiki 上查找了有关双缓冲的教程,并决定尝试将他们的代码实现到我正在尝试实现双缓冲的代码中。我收到以下错误:“java.lang.IllegalStateException:组件必须有一个有效的对等点”。

我不知道你知道与否有什么区别,但下面是main方法的代码。这只是一个在其中显示 ChronosDisplay 类的框架。我用“...”省略了不相关的代码

public class CDM extends JFrame
{
public CDM(String str)
{
super("CD:M - "+str);
try
{
...
ChronosDisplay theGame = new ChronosDisplay(str);
((Component)theGame).setFocusable(true);
add(theGame);
}
catch(Exception e)
{
System.out.println("CDM ERROR: " +e);
}
}
public static void main( String args[] )
{
CDM run = new CDM("DP_Mini");
}
}

这是我认为问题所在的代码(我认为问题出在paint()方法中)。该类显示在CDM类中

public class ChronosDisplay extends Canvas implements  Runnable
{
String mapName;
public ChronosDisplay (String str)
{
mapName = str;
new Thread(this).start();
setVisible(true);
createBufferStrategy(2);
}
public void paint( Graphics window )
{
BufferStrategy b = getBufferStrategy();
Graphics g = null;
window.setColor(Color.white);
try
{
g = b.getDrawGraphics();
paintMap(g);
paintUnits(g);
paintBullets(g);
}
finally
{ g.dispose(); }
b.show();
Toolkit.getDefaultToolkit().sync();
}
public void paintMap( Graphics window )
{
TowerMap m = new TowerMap();
try
{
m = new TowerMap(mapName);
for(int x=0; x<m.getRows()*50; x+=50)
{
for(int y = 0; y<m.getCols()*50; y+=50)
{
int tileType = m.getLocation(x/50,y/50);
Image img;
if(tileType == 0)
{
Tile0 t = new Tile0(x,y);
t.draw(window);
}
...// More similar if statements for other integers
}
catch(Exception e) ...
}
...// Additional methods not shown here
public void run()
{
try
{
while(true)
{
Thread.currentThread().sleep(20);
repaint();
}
}
catch(Exception e) ...
}
}

如果您好奇(我怀疑这很重要),Tile0 类中的draw() 方法是:

public void draw( Graphics window )
{
window.drawImage(img,getX(),getY(),50,50,null);
}

非常感谢任何指示、提示或解决方案。谢谢你的时间! :D

最佳答案

Swing 默认情况下是双缓冲的,因此您无需自己实现。

您不应该在 Swing 应用程序中使用 Canvas 类。也就是说,不要混合使用 AWT 和 Swing 组件。

所有 Swing 组件都应在 EDT 上创建。请阅读 Swing 教程以获取有关如何执行此操作的示例。

关于java - Java 中的双缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2842366/

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