Для достижения результатов, которые вы получаете, у вас либо есть другой класс, который простирается от Canvas
, либо использует BufferStrategy
из контейнера верхнего уровня. В любом случае оба должны быть видимыми на экране.
В основном, они борются друг с другом, поскольку они представляют собой два разных алгоритма окраски. Swing, который является алгоритмом пассивной графики, рисует обновления по мере необходимости и BufferStrategy
, который использует активный алгоритм, требуя, чтобы вы планировали обновление буфера по мере необходимости.
Оба используют алгоритм двойной буферизации.
Таким образом, вы должны выбрать один или другой ...
public class Screen extends JComponent {
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g.create();
g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); //sprites overlap instead of overwrite
if (game == null) {
drawSplash(g2D);
} else {
drawBoard(g2D);
}
g2D.dispose();
}
}
или что-то вроде ...
public void gameEngine(BufferStrategy strategy) {
// Main loop
while (!done) {
// Prepare for rendering the next frame
// ...
// Render single frame
do {
// The following loop ensures that the contents of the drawing buffer
// are consistent in case the underlying surface was recreated
do {
// Get a new graphics context every time through the loop
// to make sure the strategy is validated
Graphics2D g2D = (Graphics2D) strategy.getDrawGraphics();
// Render to graphics
g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); //sprites overlap instead of overwrite
if (game == null) {
drawSplash(g2D);
} else {
drawBoard(g2D);
}
// Dispose the graphics
g2D.dispose();
// Repeat the rendering if the drawing buffer contents
// were restored
} while (strategy.contentsRestored());
// Display the buffer
strategy.show();
// Repeat the rendering if the drawing buffer was lost
} while (strategy.contentsLost());
}
}
Который был в значительной степени сорвал с JavaDocs for BufferStrategy
BTW, это ...
@Override
public Dimension getPreferredSize(){
Dimension tempDimension = Toolkit.getDefaultToolkit().getScreenSize();
return tempDimension;
}
- очень плохой дизайн, вы делаете предположения о состоянии компонента, который может не соответствовать действительности. Вы должны разрешить окну решать, насколько он в конечном итоге будет нужен, чего можно достичь, используя setExtendedState
и передав его JFrame.MAXIMIZED_BOTH
, в котором будут учтены другие элементы ОС, такие как панель задач или док-станция.
Вы смешиваете два системы окраски, пассивная (с двойной буферизацией) система качания и система прямой окраски BufferStrategy. Не делайте этого, выбирайте тот или другой – MadProgrammer