Java: JFrame Graphics 未绘制矩形
Java: JFrame Graphics not drawing rectangle
各位程序员大家好,
我 运行 在我的代码中遇到了一个我似乎无法破解的小问题。它与Jframe有关; Java 的图形区域。我将在下面 post 的代码是基于绘图方法的。其目的是绘制 ArrayList roomList
中的“房间”,后者位于另一个 class 中,因此之前 lvl.
。这种偏离路线的情况不会发生,因此 post 在此处。
public class LevelGUI implements Observer {
private Level lv;
private Display d;
public LevelGUI(Level level, String name) {
this.lv = level;
JFrame frame = new JFrame(name);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
d = new Display(lv, 500, 500);
frame.getContentPane().add(d);
frame.pack();
frame.setLocation(0, 0);
frame.setVisible(true);
}
private class Display extends JPanel {
public Display(Level fp, int x, int y) {
addKeyListener(new Listener());
setBackground(Color.GRAY);
setPreferredSize(new Dimension(x + 20, y + 20));
setFocusable(true);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
draw(g);
}
private void draw(Graphics g) {
Level lvl = new Level();
for(int i = 0; i < lvl.roomList.size(); i++) {
Room room = lvl.roomList.get(i);
g.setColor(room.floorColor);
g.drawRect(room.posX, room.posY, room.roomWidth, room.roomHeight);
}
}
}
}
获取有关该程序的一些背景信息。 roomList
是 ArrayList,它充满了各种不同大小和颜色的房间。房间本身是 objects.
先到先得Level
class:
public class Level extends Observable {
private boolean Switch = true;
public ArrayList<Room> roomList = new ArrayList<Room>();
(...)
}
这里是用来创建房间的ClassRoom()
。
public class Room {
Color floorColor;
int roomWidth;
int roomHeight;
int posX;
int posY;
public Room(int dx, int dy, Color color) {
this.floorColor = color;
this.roomHeight = dy;
this.roomWidth = dx;
this.posY = 0;
this.posX = 0;
}
(...)
}
我已经找到问题发生的地方,它是 for-loop 中的代码。我尝试将 roomList.size()
切换为 整数 以测试它是否是循环。但事实并非如此。可以在 for-loop.
之外绘制图形
再一次,问题 不是错误消息,程序根本没有绘制我指示它在 [=40= 中绘制的房间]方法 draw()
.
显示输出如下所示:
谢谢!
请注意,只要框架认为组件需要在屏幕上呈现,Swing 就会调用 paintComponent() 方法。这通常是在 window 变得可见时 - 最初或因为其他一些 window 不再隐藏该组件。此类事件是您无法控制的。
因此您的应用程序应该创建一个状态并随时准备绘制它。因此,您不会在 paint() 或 paintComponent() 方法内创建状态(如关卡)。把它放在别处——如果需要的话放在构造函数中。
看看你的代码:
当您在 paintComponent()/draw() 中创建一个新关卡时,假设该关卡没有关联的房间是否正确?在那种情况下,该方法是正确的 return 没有画任何东西。
如果您的应用程序认为应该更新屏幕,请调用 repaint(),知道 paint() 方法将很快被框架调用。
各位程序员大家好,
我 运行 在我的代码中遇到了一个我似乎无法破解的小问题。它与Jframe有关; Java 的图形区域。我将在下面 post 的代码是基于绘图方法的。其目的是绘制 ArrayList roomList
中的“房间”,后者位于另一个 class 中,因此之前 lvl.
。这种偏离路线的情况不会发生,因此 post 在此处。
public class LevelGUI implements Observer {
private Level lv;
private Display d;
public LevelGUI(Level level, String name) {
this.lv = level;
JFrame frame = new JFrame(name);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
d = new Display(lv, 500, 500);
frame.getContentPane().add(d);
frame.pack();
frame.setLocation(0, 0);
frame.setVisible(true);
}
private class Display extends JPanel {
public Display(Level fp, int x, int y) {
addKeyListener(new Listener());
setBackground(Color.GRAY);
setPreferredSize(new Dimension(x + 20, y + 20));
setFocusable(true);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
draw(g);
}
private void draw(Graphics g) {
Level lvl = new Level();
for(int i = 0; i < lvl.roomList.size(); i++) {
Room room = lvl.roomList.get(i);
g.setColor(room.floorColor);
g.drawRect(room.posX, room.posY, room.roomWidth, room.roomHeight);
}
}
}
}
获取有关该程序的一些背景信息。 roomList
是 ArrayList,它充满了各种不同大小和颜色的房间。房间本身是 objects.
先到先得Level
class:
public class Level extends Observable {
private boolean Switch = true;
public ArrayList<Room> roomList = new ArrayList<Room>();
(...)
}
这里是用来创建房间的ClassRoom()
。
public class Room {
Color floorColor;
int roomWidth;
int roomHeight;
int posX;
int posY;
public Room(int dx, int dy, Color color) {
this.floorColor = color;
this.roomHeight = dy;
this.roomWidth = dx;
this.posY = 0;
this.posX = 0;
}
(...)
}
我已经找到问题发生的地方,它是 for-loop 中的代码。我尝试将 roomList.size()
切换为 整数 以测试它是否是循环。但事实并非如此。可以在 for-loop.
再一次,问题 不是错误消息,程序根本没有绘制我指示它在 [=40= 中绘制的房间]方法 draw()
.
显示输出如下所示:
谢谢!
请注意,只要框架认为组件需要在屏幕上呈现,Swing 就会调用 paintComponent() 方法。这通常是在 window 变得可见时 - 最初或因为其他一些 window 不再隐藏该组件。此类事件是您无法控制的。
因此您的应用程序应该创建一个状态并随时准备绘制它。因此,您不会在 paint() 或 paintComponent() 方法内创建状态(如关卡)。把它放在别处——如果需要的话放在构造函数中。
看看你的代码: 当您在 paintComponent()/draw() 中创建一个新关卡时,假设该关卡没有关联的房间是否正确?在那种情况下,该方法是正确的 return 没有画任何东西。
如果您的应用程序认为应该更新屏幕,请调用 repaint(),知道 paint() 方法将很快被框架调用。