Canvas fillRect()未填充已定义的canvas

我正在扩展Canvas并将其添加到JFrame 。 我知道AWT和Swing不应该是混合的,并且在JPanel上绘图是首选,但我正在尝试遵循游戏引擎教程,我想坚持它,因为我到目前为止工作。 CanvasminimumSizemaximumSizeprefferedSize设置为maximumSize的尺寸。 当我进行绘图调用graphics.draw(0,0,550,400)它不会像应该的那样填满整个屏幕。 我将绘图调用更改为graphics.draw(0,0,560,410)基本上为它添加了10px,它填满了整个屏幕。 怎么了?

BTW: graphics.draw(10,10,550,400从角落开始绘制矩形,所以我不认为JFrame是问题。

Launcher类内部的主要调用

  public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { game.setMinimumSize(DIMENSIONS); game.setMaximumSize(DIMENSIONS); game.setPreferredSize(DIMENSIONS); game.frame = new JFrame(NAME); game.frame.setLayout(new BorderLayout()); game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); game.frame.add(game, BorderLayout.CENTER); game.frame.pack(); game.frame.setResizable(false); game.frame.setLocationRelativeTo(null); game.frame.setVisible(true); Logger.log(TAG, "Game starting"); game.start(); } }); } 

平局调用, Launcher.HEIGHTWIDTH550,400

  public void draw(float deltaTime, Graphics2D graphics) { graphics.setColor(Color.BLACK); graphics.fillRect(0, 0, 550, 400); graphics.setColor(Color.DARK_GRAY); graphics.fillRect(0, 0, 150, 40); graphics.fillRect(0, Launcher.HEIGHT - 100, Launcher.WIDTH, 100); graphics.setColor(Color.LIGHT_GRAY); graphics.fillRect(125, Launcher.HEIGHT - 100, 100, 350); } 

扩展的Canvas

 public abstract class Game extends Canvas implements Runnable { private static final String TAG = "Game"; public JFrame frame; public JPanel panel; public boolean isApplet = false; private boolean gameRunning = false; BufferStrategy bufferStrategy; private Screen screen; private Thread renderThread; public synchronized void start() { // Canvas setBounds(0, 0, 550, 400); setIgnoreRepaint(true); createBufferStrategy(2); bufferStrategy = getBufferStrategy(); // Screen, Handlers, ETC screen = getStartScreen(); // Threads renderThread = new Thread(this, Launcher.NAME + "_main"); renderThread.start(); gameRunning = true; } @Override public void run() { long startTime = System.nanoTime(); while (gameRunning) { float deltaTime = (System.nanoTime() - startTime) / 1000000000.0f; startTime = System.nanoTime(); screen.update(deltaTime); Graphics2D graphics = (Graphics2D) bufferStrategy.getDrawGraphics(); screen.draw(deltaTime, graphics); graphics.dispose(); bufferStrategy.show(); // FPS Counter // FPS Capper } } } 

需要SSCCE

 import java.awt.BorderLayout; import java.awt.Canvas; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.image.BufferStrategy; import javax.swing.JFrame; import javax.swing.SwingUtilities; @SuppressWarnings("serial") public class Game extends Canvas implements Runnable { public static final int WIDTH = 550; public static final int HEIGHT = 400; public static final Dimension DIMENSIONS = new Dimension(WIDTH, HEIGHT); public static final String NAME = "SSCCE"; public boolean gameRunning = false; public JFrame frame; public BufferStrategy bufferStrategy; public static void main (String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { Game game = new Game(); game.setMinimumSize(DIMENSIONS); game.setMaximumSize(DIMENSIONS); game.setPreferredSize(DIMENSIONS); game.frame = new JFrame(NAME); game.frame.setLayout(new BorderLayout()); game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); game.frame.add(game, BorderLayout.CENTER); game.frame.pack(); game.frame.setResizable(false); game.frame.setLocationRelativeTo(null); game.frame.setVisible(true); System.out.println("Game started"); game.start(); } }); } public synchronized void start() { setSize(550, 400); setBounds(0, 0, 550, 400); setIgnoreRepaint(true); createBufferStrategy(2); bufferStrategy = getBufferStrategy(); // Threads Thread renderThread = new Thread(this, NAME + "_main"); renderThread.start(); gameRunning = true; } @Override public void run() { while (gameRunning) { Graphics2D graphics = (Graphics2D) bufferStrategy.getDrawGraphics(); graphics.setColor(Color.BLACK); graphics.fillRect(0, 0, WIDTH, HEIGHT); graphics.dispose(); bufferStrategy.show(); } } } 

至于Java 2D游戏教程我跟着它是一个网络系列。 不过,链接如下点击此处 。 我修改了很多代码。

为MadProgrammer修改

  import java.awt.BorderLayout; import java.awt.Canvas; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.image.BufferStrategy; import javax.swing.JFrame; import javax.swing.SwingUtilities; @SuppressWarnings("serial") public class Game extends Canvas implements Runnable { public static final int WIDTH = 550; public static final int HEIGHT = 400; public static final Dimension DIMENSIONS = new Dimension(WIDTH, HEIGHT); public static final String NAME = "SSCCE"; public boolean gameRunning = false; public JFrame frame; public BufferStrategy bufferStrategy; public static void main (String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { Game game = new Game(); game.setMinimumSize(DIMENSIONS); game.setMaximumSize(DIMENSIONS); game.setPreferredSize(DIMENSIONS); game.frame = new JFrame(NAME); game.frame.setLayout(new BorderLayout()); game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); game.frame.add(game, BorderLayout.CENTER); game.frame.pack(); game.frame.setResizable(false); game.frame.setLocationRelativeTo(null); game.frame.setVisible(true); System.out.println("Game started"); game.start(); } }); } public synchronized void start() { setSize(550, 400); setBounds(0, 0, 550, 400); setIgnoreRepaint(true); createBufferStrategy(2); bufferStrategy = getBufferStrategy(); // Threads Thread renderThread = new Thread(this, NAME + "_main"); renderThread.start(); gameRunning = true; } @Override public void run() { while (gameRunning) { Graphics2D graphics = (Graphics2D) bufferStrategy.getDrawGraphics(); graphics.setColor(Color.RED); // Using getWidth() graphics.fillRect(0, 0, getWidth(), getHeight()); graphics.setColor(Color.GREEN); // Using WIDTH which was used to set the size of the canvas graphics.fillRect(5, 5, WIDTH, HEIGHT); graphics.dispose(); bufferStrategy.show(); try { Thread.sleep(60); } catch (InterruptedException ex) { } } } } 

你提供的例子很好。 我稍微修改了一下来演示getWidth/height的使用

在此处输入图像描述

 public void run() { while (gameRunning) { Graphics2D graphics = (Graphics2D) bufferStrategy.getDrawGraphics(); graphics.setColor(Color.RED); graphics.fillRect(0, 0, getWidth(), getHeight()); graphics.setColor(Color.GREEN); int width = getWidth() - 50; int height = getHeight() - 50; graphics.fillRect(25, 25, width, height); graphics.setColor(Color.BLACK); FontMetrics fm = graphics.getFontMetrics(); graphics.drawString("Frame Size: " + frame.getWidth() + "x" + frame.getHeight(), 0, fm.getAscent()); graphics.drawString("Canvas Size: " + getWidth() + "x" + getHeight(), 0, fm.getAscent() + fm.getHeight()); graphics.dispose(); bufferStrategy.show(); try { Thread.sleep(60); } catch (InterruptedException ex) { } } }