JFrame не отображает холст - PullRequest
0 голосов
/ 26 июня 2018

Я недавно работал с BufferStrategy и JFrame для предварительной графики. Однако при попытке нарисовать простой прямоугольник на рамке ничего не появляется. Вот код:

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

public class GTestingMain {

public static void main(String[] args) {

    JFrame myFrame = new JFrame();
    Canvas myCanvas = new Canvas();
    Graphics2D g;
    BufferStrategy strategy;

    myFrame.setSize(500, 500);
    myFrame.setResizable(false);
    myFrame.setLocationRelativeTo(null);
    myFrame.setVisible(true);
    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    myCanvas.setPreferredSize(new Dimension(500, 500));

    myFrame.add(myCanvas);
    myFrame.pack();

    strategy = myCanvas.getBufferStrategy();
    if(strategy == null) {
        myCanvas.createBufferStrategy(3);
    }
    strategy = myCanvas.getBufferStrategy();//Throwing in again so strategy != null

    do {

        do {

            g = (Graphics2D) strategy.getDrawGraphics();
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, 500, 500);
            g.setColor(Color.red);
            g.fillRect(10, 40, 50, 70);
            g.dispose();


        }while(strategy.contentsRestored());
        strategy.show();

    }while(strategy.contentsLost());

}

}

Теперь проблема немного более уникальна. Когда я захожу в отладчик и перебираю код, он работает просто отлично. Если я бегу нормально, пусто. Если я нажму на фрейм до того, как он будет нарисован в отладчике - пусто.

Я знаю, что могу «решить» эту проблему с помощью потока, но я хотел бы знать, почему это работает * в режиме отладки, но не в обычном режиме. Спасибо!

1 Ответ

0 голосов
/ 26 июня 2018

Прежде чем начать с bufferStrategies, пройдите java doc

Это говорит, что

Буферная стратегия дает вам два универсальных метода для рисования: getDrawGraphics и show. Если вы хотите начать рисовать, возьмите рисованную графику и используйте ее. Когда вы закончите рисовать и хотите представить свою информацию на экране, вызовите шоу. Эти два метода разработаны, чтобы изящно вписаться в цикл рендеринга:

Чего вам не хватает, так это цикла рендеринга. Кроме того, поскольку он использует нестабильные изображения для своего буфера, мы никогда не узнаем, когда теряется наша видеопамять. Это объясняет, почему вы получили прямоугольник в режиме отладки. Это похоже на систему обратного вызова с contentLost и contentsRestored методами.

Просто оберните петли do while, как показано ниже.

while(isHappy()){ // your logic goes here.
    do {

        do {

            g = (Graphics2D) strategy.getDrawGraphics();
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, 500, 500);
            g.setColor(Color.red);
            g.fillRect(10, 40, 50, 70);
            g.dispose();


        }while(strategy.contentsRestored());
        strategy.show();

    }while(strategy.contentsLost());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...