Java: java .awt.Canvas не согласован в IntelliJ на Ма c Каталина - PullRequest
0 голосов
/ 18 января 2020

Я использую версию IntelliJ Community для Ma c, Catalina, хотя все это не должно влиять на программу. Я просто хочу, чтобы на экране появилось окно голубого цвета, используя

class Main extends Canvas implements Runnable {...}

и

class Window extends Canvas {...}

Я провел дополнительное тестирование и ниже почти не имеет значения

Я запущу программу в редакторе и получу то, что ожидаю, голубой прямоугольник, который заполняет окно. Затем я нажимаю на красный пузырь, чтобы выйти.

В этот момент, если я снова запускаю его в редакторе, я все равно получаю голубой прямоугольник. Но на этот раз я использую cmd + Q для принудительного выхода.

Теперь, когда я запускаю его снова, я получаю пустой Canvas, и на консоли не печатается частота кадров, как в строке 70 Main. java.

Затем я добавил журнал в функцию Main.render () и попытался снова. Это исправило это. Я снова принудительно вышел, удалил линию, и это сработало. Затем я принудительно завершаю (снова), и на этот раз, он сломался (снова).

Это проблема с моей конфигурацией?

Снова релевантно

Хорошо, так что программа, кажется, работает несколько раз, а иногда ... просто ... нет. Это смесь принудительного выхода и красного пузыря.

Это код:

Main. java:

package com.myname.main;

import java.awt.*;
import java.awt.image.*;

public class Main extends Canvas implements Runnable {

    private static final long serialVersionUID = 1;
    private Thread thread;
    private boolean running = false;

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


    public Main() {
        new Window(WIDTH, HEIGHT, "Window", 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();
        }
    }
    private void tick() {

    }
    private void render() {
        BufferStrategy b = this.getBufferStrategy();
        if (b == null) {
            this.createBufferStrategy(3);
            return;
        }
        Graphics g = b.getDrawGraphics();

        g.setColor(Color.cyan);
        g.fillRect(0, 0, WIDTH, HEIGHT);
        g.dispose();
        b.show();
    }
    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.printf("FPS: %d%n", frames);
                frames = 0;
            }
        }
        stop();
    }
    public static void main(String[] args) {
        new Main();
    }
}

Окно. java :

package com.myname.main;

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

public class Window extends Canvas {

    private static final long serialVersionUID = 1;
    public Window(int width, int height, String title, Main game) {
        // Frame
        JFrame f = new JFrame(title);

        // Size
        Dimension d = new Dimension(width, height);
        f.setMinimumSize(d);
        f.setMaximumSize(d);
        f.setPreferredSize(d);

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

}

Да, я следую учебному пособию RealTutsGML на YouTube.

...