英文:
Why is there a weird white rectangle in the left corner of my window?
问题
对于某些原因,我的屏幕左上角出现了一个奇怪的白色矩形。我还尝试在JPanel上绘制一个正方形,但似乎没有起作用。我可能还应该提到,我刚开始学习关于JFrame和JPanel的知识(尽管我已经制作了一些简单的应用程序),所以您在下面看到的代码可能不太整洁:
**Main**
import javax.swing.*;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame("Space Ship");
new GameFrame(frame);
new GameGraphics();
}
}
**GameFrame**
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();
}
}
**GameGraphics**
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() {}
}
**Player**
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);
}
}
提前谢谢!
英文:
For some reason there is a weird white rectangle in the upper left corner of my screen. I was also try to draw a square on the JPanel and it does not seem to be working. I should also probably mention that I am just beginning to learn about Jframes and Jpanels (although I have made a few simple apps) so the code you see bellow might not be very clean:
Main
import javax.swing.*;
public class Main {
public static void main(String[] agrs) {
JFrame frame = new JFrame("Space Ship");
new GameFrame(frame);
new GameGraphics();
}
}
GameFrame
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();
}
}
GameGraphics
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() {}
}
Player
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);
}
}
Thank you in advance!
答案1
得分: 1
下面是翻译好的内容:
在你的主方法中,new GameGraphics()
语句的目的是什么?
这是不必要的,也不应该出现在那里。将其删除。
Player(int playerX, int playerY, int playerWidth, int playerHeight) {
super.setBounds(x, y, width, height);
}
上述代码的目的是什么?你在构造函数中传入参数,但是之后你从未使用过这些参数。
你的代码之所以能够编译通过,是因为 Rectangle 类具有那4个字段,但它们将具有默认值(而不是你期望的值),这可能会导致绘图问题。
不要继承 Rectangle!你没有向 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 对象的实例。
英文:
What is the point of the new GameGraphics()
statement in your main method?
It is not needed and should not be there. Get rid of it.
Player(int playerX, int playerY, int playerWidth, int playerHeight) {
super.setBounds(x, y, width, height);
}
What is the point of the above code? You pass in parameters in the constructor, but then you never use the parameters.
Your code only compiles because the Rectangle class has those 4 field, but they would have default values (not the values you expect), which would probably cause your painting problems.
Don't extend Rectangle! You are not adding any new functionality to the Rectangle class.
Your Player
class does not need to extend any class. Instead your Player
class should look something like:
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);
}
}
As noted by sorifiend, you are also not creating an instance of your Player object.
答案2
得分: 0
看起来你有一个NullPointerException
,因为在GameGraphics
类中从未定义player
,这导致了图形方面的错误:
Player player;
看起来你已经创建了一个设置玩家的方法,但它从未被调用过:
public void newPlayer() {
player = new Player(playerX, playerY, playerWidth, playerHeight);
}
一个解决方案是在你的GameGraphics()
构造函数中调用newPlayer()
方法:
GameGraphics() {
this.setPreferredSize(SCREEN);
this.setBackground(Color.BLACK);
//在这里调用它
newPlayer();
}
或者你可以这样创建玩家:
public class GameGraphics extends JPanel implements Runnable {
//...
Player player = new Player(playerX, playerY, playerWidth, playerHeight);
//...
}
一旦修复了这个问题,它就不应该再引起错误了。
<details>
<summary>英文:</summary>
It looks like you have a `NullPointerException` because `player` is never defined in the `GameGraphics` class, and it is causing a glitch with your graphics:
Player player;
It looks like you have created a method to setup the player, but it never gets called:
public void newPlayer() {
player = new Player(playerX, playerY, playerWidth, playerHeight);
}
One solution could be to call the `newPlayer()` method in your `GameGraphics()` constructor:
GameGraphics() {
this.setPreferredSize(SCREEN);
this.setBackground(Color.BLACK);
//add it here
newPlayer();
}
Or you can create the player like this:
public class GameGraphics extends JPanel implements Runnable {
//...
Player player = new Player(playerX, playerY, playerWidth, playerHeight);
//...
Once that is fixed it should no longer cause issue.
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论