gpt4 book ai didi

java - 涉及java中背景图像的奇怪错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:15:00 26 4
gpt4 key购买 nike

我的问题是,当我运行我的程序时,我得到了一个白色的屏幕和来自早期版本的文本,而不是应该显示的背景图像。我删除了与该构建相关的所有代码。

我四处寻找帮助,我看到的所有线程都说要按照我的设置方式编写代码。我什至不明白显示的背景是从哪里来的。

这是相关代码:

package tactics;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.swing.JFrame;

public class Tactics2 extends JFrame{
private Screen s;
private BufferedImage bg;
private BufferedImage template;
private boolean loaded = false;

public static void main(String[] args) throws IOException{

DisplayMode dm = new DisplayMode(1024, 768, 16, DisplayMode.REFRESH_RATE_UNKNOWN);
Tactics2 t = new Tactics2();
t.run(dm);
}

//run method
public void run(DisplayMode dm) throws IOException{
loadpics();

s = new Screen();
try{
s.setFullScreen(dm, this);
try{
Thread.sleep(5000);
}catch(InterruptedException ex){}
}finally{
s.restoreScreen();
}
}

public void loadpics() throws IOException{
bg = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_RGB);
template = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_RGB);
ChaosBack cb = new ChaosBack();
bg = cb.ChaosBack(bg, template);
loaded = true;
repaint();
}

@Override
public void paint(Graphics g){
if(loaded){
g.drawImage(bg, 0, 0, null);
}
}
}

最佳答案

你打破了油漆链

@Override
public void paint(Graphics g){
if(loaded){
g.drawImage(bg, 0, 0, null);
}
}

基本上,您未能调用 super.paintGraphics 是共享资源,也就是说,为给定绘制周期绘制的所有内容都使用相同的 Graphics 上下文。

绘画链的部分工作是通过清除 Graphics 上下文来准备绘画。

出于多种原因,您应该避免覆盖顶级容器的 paint。它不是双缓冲的,因此它在更新时可能会闪烁,并且它没有考虑框架装饰,这意味着您最终可以在框架的边界下方而不是在可视区域内绘画。

你最好创建一个自定义组件,从类似 JPanel 的东西扩展并覆盖它的 paintComponent 方法(确保你调用 super.paintComponent)

Thread.sleep(5000);Swing 应用程序中是一个非常糟糕的主意。可以实际停止您的应用程序并停止更新/绘制或响应任何用户交互。

Swing 不是线程安全的。这意味着对 UI 的所有更改都必须在事件调度线程的上下文中进行。

看看:

详细信息和想法

关于java - 涉及java中背景图像的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21593184/

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