Java Swing 呈现不同的背景

Posted

技术标签:

【中文标题】Java Swing 呈现不同的背景【英文标题】:Java Swing renders a different background 【发布时间】:2021-08-24 21:13:01 【问题描述】:

我正在开发一款游戏。我遇到的问题是在游戏渲染开始之前(应该渲染黑色背景)它显示白色背景。它会发生一秒钟,然后开始正确的渲染。我不确定如何解决这个问题。

所有渲染代码都在一个线程内运行。我试图在第一次渲染后使窗口可见,但我在 createImage 方法上得到了 NPE。

import javax.swing.*;
import java.awt.*;

public class Window extends JFrame implements Runnable 
    private Thread windowThread;
    private int width, height;
    private String windowName;
    private boolean isExecuting;
    private GameState gameState;

    private Graphics graphics;

    public Window() 
        loadWindowConfiguration();
        windowThread = new Thread(this);
    

    private void loadWindowConfiguration() 
        setWindowProperties();
    

    private void setWindowProperties() 
        this.windowName = Constants.WINDOW_NAME;
        this.width = Constants.WINDOW_WIDTH;
        this.height = Constants.WINDOW_HEIGHT;
        this.setTitle(windowName);
        this.setSize(new Dimension(this.width, this.height));
        this.setResizable(Constants.IS_RESIZABLE_WINDOW);
        this.setFocusable(Constants.IS_FOCUSABLE_WINDOW);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(Constants.IS_VISIBLE_WINDOW); // Set to true
        graphics = (Graphics2D)this.getGraphics();
    

    public void update(double delta) 
        gameState.update(delta);
    

    public void render() 
        Image img = this.createImage(this.getWindowWidth(), this.getWindowHeight());
        Graphics g = img.getGraphics();
        Graphics2D doubleBuffer = (Graphics2D) g;

        doubleBuffer.setColor(getBackground());
        //doubleBuffer.fillRect(0, 0, this.getWindowWidth(), this.getWindowHeight());

        gameState.render(doubleBuffer);

        graphics.drawImage(img, 0, 0, this);
    

    public void startWindow()  windowThread.start(); 

    public void stopWindow() 
        this.isExecuting = false;
    

    private void clean() 
        graphics.dispose();
        this.dispose();
        windowThread.interrupt();
    

    @Override
    public void run() 
        this.isExecuting = true;

        gameState.loadGame();

        while(this.isExecuting) 
            update(delta);
            render();

        

        clean();
    

【问题讨论】:

1) 不要使用 getGraphics() 进行绘画。 2)不要使用带有while循环的线程。对于动画,请使用 Swing Timer。 3) 不需要 BufferedImage,只需在 JPanel 上进行自定义绘画。 4) 只需使用面板的setBackground(...) 方法阅读Swing Tutorial。 Custom PaintingHow to Use Swing Timer 部分应该是一个很好的起点。 【参考方案1】:

您需要使用 Java AWT 中的 setBackground() 方法来创建背景。

您是否使用 Eclipse 来构建您的应用程序?如果是这样,只需使用 WindowBuilder,如果您在渲染背景时遇到问题,所有内容都应该在侧工具栏上。

正如 WJS 所建议的,我建议您阅读 Java Swing 的文档。您的大部分问题应该可以通过link 得到解答。

【讨论】:

以上是关于Java Swing 呈现不同的背景的主要内容,如果未能解决你的问题,请参考以下文章

Java swing 窗体如何设置背景图片?

java中的swing设计界面时怎么加上背景图片。而不覆盖啥label等控件?

java中如何为JFrame设置背景图片,拜托给一个简单的实例。谢谢了。

Java Swing中怎样简单方便的设置背景图片

Java Swing 怎么自定义界面背景图片

java中swing界面上怎么给jpanel上添加背景图片