为啥我的窗口左角有一个奇怪的白色矩形?

Posted

技术标签:

【中文标题】为啥我的窗口左角有一个奇怪的白色矩形?【英文标题】:Why is there a weird white rectangle in the left corner of my window?为什么我的窗口左角有一个奇怪的白色矩形? 【发布时间】:2020-12-04 21:18:15 【问题描述】:

由于某种原因,我的屏幕左上角有一个奇怪的白色矩形。我还尝试在 JPanel 上画一个正方形,但它似乎不起作用。我还应该提一下,我刚刚开始学习 Jframes 和 Jpanels(虽然我已经制作了一些简单的应用程序),所以您在下面看到的代码可能不是很干净:

主要

import javax.swing.*; 


public class Main 

public static void main(String[] agrs) 

    JFrame frame = new JFrame("Space Ship"); 

    new GameFrame(frame);
    new GameGraphics();
   

游戏框架

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class GameFrame 

    GameGraphics game; 

    GameFrame(JFrame frame) 
        game = new GameGraphics(); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(game);
        frame.setResizable(false);
        frame.setVisible(true);
        frame.pack();
    

游戏图形

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

public class GameGraphics extends JPanel implements Runnable 
    
    static final int SCREEN_WIDTH = 1000;
    static final int SCREEN_HEIGHT = SCREEN_WIDTH * 9 / 16;
    static final Dimension SCREEN = new Dimension(SCREEN_WIDTH, SCREEN_HEIGHT); 
    Player player; 
    int playerHeight = 25;
    int playerWidth = 25;
    int playerX = (SCREEN_WIDTH/2) - 200;  
    int playerY = SCREEN_HEIGHT/2; 

    GameGraphics() 
        this.setPreferredSize(SCREEN);
        this.setBackground(Color.BLACK);
    

    public void start() 

    public void newPlayer() 
        player = new Player(playerX, playerY, playerWidth, playerHeight);
    

    public void newFireball() 

    public void collisons() 

    public void gameOver() 

    public void paintComponent(Graphics g) 
        super.paintComponent(g); 
        draw(g); 
    

    public void draw(Graphics g) 
        player.draw(g);
    

    @Override
    public void run() 

播放器

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

public class Player extends Rectangle 
    int x = 200; 
    int y = 200; 

    Player(int playerX, int playerY, int playerWidth, int playerHeight) 
        super.setBounds(x, y, width, height);
    

    public void draw(Graphics g) 
        g.setColor(Color.BLUE);
        g.fillRect(x, y, width, height);
    

提前谢谢你!

【问题讨论】:

这是我建议粘贴到屏幕图像中的少数几次之一,显示这个奇怪的矩形。 同意@NomadMaker:在询问图形输出时非常需要屏幕截图。 请显示图片或至少显示图片链接,以便我们查看您的问题。 对不起,我没有及时看到你们,我的问题已经解决了。如果我再问图形问题,我一定会发布截图! 【参考方案1】:

您的 main 方法中的 new GameGraphics() 语句有什么意义?

它不是必需的,也不应该在那里。摆脱它。

Player(int playerX, int playerY, int playerWidth, int playerHeight) 
    super.setBounds(x, y, width, height);

上面的代码有什么意义?你在构造函数中传入参数,但你从不使用参数。

您的代码只能编译,因为 Rectangle 类有这 4 个字段,但它们会有默认值(不是您期望的值),这可能会导致您的绘画问题。

不要扩展矩形!您没有向 Rectangle 类添加任何新功能。

您的Player 类不需要扩展任何类。相反,您的 Player 类应该类似于:

public class Player 
    int playerX; 
    int playerY; 
    int playerWidth;
    int playerHeight;

    Player(int playerX, int playerY, int playerWidth, int playerHeight) 
        this.playerX = playerX;
        this.playerY = playerY;
        this.playerWidth = playerWidth;
        this.playerHeight = playerHeight;

    

    public void draw(Graphics g) 
        g.setColor(Color.BLUE);
        g.fillRect(playerX, playerY, playerWidth, playerHeight);
    

正如 sorifiend 所说,您也没有创建 Player 对象的实例。

【讨论】:

【参考方案2】:

看起来您有一个NullPointerException,因为player 从未在GameGraphics 类中定义,它会导致您的图形出现故障:

Player player; 

看起来您已经创建了一个设置播放器的方法,但它从未被调用:

public void newPlayer() 
    player = new Player(playerX, playerY, playerWidth, playerHeight);

一种解决方案是在GameGraphics() 构造函数中调用newPlayer() 方法:

GameGraphics() 
    this.setPreferredSize(SCREEN);
    this.setBackground(Color.BLACK);
    //add it here
    newPlayer();

或者你可以像这样创建播放器:

public class GameGraphics extends JPanel implements Runnable 
    //...
    Player player = new Player(playerX, playerY, playerWidth, playerHeight);
    //...

一旦修复,它应该不再引起问题。

【讨论】:

以上是关于为啥我的窗口左角有一个奇怪的白色矩形?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的OpenGL程序只输出一个白色背景的窗口而没有图形呢?

调整窗口大小会导致位图被覆盖

为啥我运行程序时WPF标题栏背景是白色的?

为啥不显示消息框?

OpenGL - 如何绘制一个完整的窗口矩形

初学QT,在进度条上加一个label,为啥会出现白色底纹啊?哪位大侠能告诉我,这是啥原因啊?