По какой причине Jframe не появляется? - PullRequest
0 голосов
/ 27 февраля 2020

У меня проблемы с созданием JFrame, так как он не отображается. Когда я запускаю код, я распечатываю фреймы, как и ожидалось, однако я не понимаю, почему фрейм не появляется. Я только перечислил весь код, чтобы ничего не пропустить. (Кстати, я на OSX) Это класс "Window":

package com.tut.main;

import java.awt.Canvas;
import java.awt.Dimension;

import javax.swing.JFrame;

public class Window extends Canvas {

    private static final long serialVersionUID = 7047229882324904790L;

    public Window(int width, int heigth, String title, Game game) {

        JFrame frame = new JFrame(title);
        frame.setPreferredSize(new Dimension(width,heigth));
        frame.setMaximumSize(new Dimension(width,heigth));
        frame.setMinimumSize(new Dimension(width,heigth));

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                   
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);                                      
        frame.add(game);                                                        
        frame.setVisible(true);
        game.start();
    }
}

А это второй класс "Game":

    package com.tut.main;

    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.image.BufferStrategy;

    public class Game extends Canvas implements Runnable{

    private static final long serialVersionUID = 8845325147047547333L;

    public static final int WIDTH = 640, HEIGTH = WIDTH / 12 * 9;

    private Thread thread;
    private boolean running = false;

    public Game(){
        new Window(WIDTH, HEIGHT, "Game", this);
    }

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

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

    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 >= 0) {
                tick();
                delta--;
            }
            if(running)
                render();
            frames++;

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

    private void tick() {

    }

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


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


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

}
...