为什么我的日食没有设置背景颜色?

时间:2015-12-27 03:28:20

标签: java awt

我为游戏设计了一个代码。问题是背景不会改变我从图形颜色库中选择的任何颜色。

我需要有人用我提供的代码来解决这个问题(请不要制作一个全新的代码)。 idk为什么java / eclipse不会显示它?我错过了什么?此处的程序应显示背景色为蓝色的GUI。相反,我变白了。

public class MainApp extends Canvas implements Runnable {

    private static final long serialVersionUID = 8928635543572788908L;

    private static final int WIDTH= 648, HEIGHT= WIDTH/ 12 * 9;
    private Thread thread;
    private boolean running= false;

    public MainApp()
    {
        new Window(WIDTH, HEIGHT, "App", this);
    }
    public synchronized void start()
    {
        thread= new Thread(this);
        thread.start();
        running= true;
    }
    public void run()
    {
        long lastTime= System.nanoTime();
        double amountOfTicks= 60.0;
        double ns= 1000000000 / amountOfTicks;
        double delta= 0;
        long timer= System.currentTimeMillis();
        int frames= 0;
        while(running){
            long now= System.nanoTime();
            delta += (now- lastTime) / ns;
            lastTime= now;
            while(delta >= 1){
                tick();
                delta--;
            }
            if(running)

            render();
            frames++;

            if(System.currentTimeMillis() - timer > 1000)
            {
                timer += 1000;
                System.out.print("FPS: " + frames);
                frames= 0;
            }
        }
        stop();
    }

    public synchronized void stop()
    {
        try
        {
            thread.join();
            running= false;
        }catch(Exception e){e.printStackTrace();}
    }
    public void tick()
    {

    }
    public void render()
    {
        BufferStrategy bs= this.getBufferStrategy();
        if(bs== null)
        {
            this.createBufferStrategy(3);
            return;
        }

        Graphics g= bs.getDrawGraphics();
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, WIDTH, HEIGHT);
        g.dispose();
        bs.show();
    }
    public static void main(String[] args) {
        new MainApp();
    }
}

1 个答案:

答案 0 :(得分:1)

您的代码有点混乱,您不应该从Window创建MainApp的新实例,Window应创建它(恕我直言)。

此外,您应该覆盖getPreferredSize MainApp方法,因为这是控制窗口可视大小的方式,这样,当您在{{1上使用pack时它将确保窗口大于其内容的JFrame,允许框架装饰环绕其外部。

但是,您遇到的主要问题是preferredSizeMainApp添加到JFrame已经可见之后

以下为我工作......

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;

public class MainApp extends Canvas implements Runnable {

    private static final long serialVersionUID = 8928635543572788908L;

    private static final int WIDTH = 648, HEIGHT = WIDTH / 12 * 9;
    private Thread thread;
    private boolean running = false;

    public MainApp() {
        new Window("App", this);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(WIDTH, HEIGHT);
    }

    public synchronized void start() {
        thread = new Thread(this);
        thread.start();
        running = true;
    }

    public void run() {
        long lastTime = System.nanoTime();
        double amountOfTicks = 60.0;
        double ns = 1000000000 / amountOfTicks;
        double delta = 0;
        long timer = System.currentTimeMillis();
        int frames = 0;
        while (running) {
            long now = System.nanoTime();
            delta += (now - lastTime) / ns;
            lastTime = now;
            while (delta >= 1) {
                tick();
                delta--;
            }
            if (running) {
                render();
            }
            frames++;

            if (System.currentTimeMillis() - timer > 1000) {
                timer += 1000;
                System.out.print("FPS: " + frames);
                frames = 0;
            }
        }
        stop();
    }

    public synchronized void stop() {
        try {
            thread.join();
            running = false;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void tick() {

    }

    public void render() {
        BufferStrategy bs = this.getBufferStrategy();
        if (bs == null) {
            this.createBufferStrategy(3);
            return;
        }

        Graphics g = bs.getDrawGraphics();
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, WIDTH, HEIGHT);
        g.dispose();
        bs.show();
    }

    public static void main(String[] args) {
        new MainApp();
    }

    public static class Window {

        private Window(String title, MainApp app) {
            JFrame frame = new JFrame(title);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(app);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
            app.start();
        }

    }

}