[英]Java: JFrame Graphics not drawing rectangle
各位程序員好,
我在我的代碼中遇到了一個我似乎無法破解的小問題。 它與Jframe有關; Java的圖形區。 我將在下面發布的代碼是關於繪圖方法的。 其目的是繪制ArrayList roomList
中的“房間”,該房間列表位於另一個 class 因此lvl.
前。 這種偏離路線不會發生,因此在這里發帖。
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 ,它充滿了各種不同大小和顏色的房間。 房間本身就是對象。
這是第一Level
class :
public class Level extends Observable {
private boolean Switch = true;
public ArrayList<Room> roomList = new ArrayList<Room>();
(...)
}
這是用於創建房間的Class Room()
。
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()
切換為integer以測試它是否是循環。但事實並非如此。 可以在for-loop之外繪制圖形。
再一次,問題不是錯誤消息,程序根本沒有繪制我指示它在方法draw()
中繪制的房間。
預先感謝!
請注意,每當框架認為組件需要在屏幕上呈現時,Swing 就會調用 paintComponent() 方法。 這通常是當 window 變得可見時 - 最初或因為其他一些 window 不再隱藏組件。 此類事件超出您的控制范圍。
所以你的應用程序應該創建一個 state 並准備好隨時繪制它。 因此,您不要在 paint() 或 paintComponent() 方法中創建 state(如關卡)。 把它放在其他地方——如果需要的話,放在構造函數中。
查看您的代碼:當您在paintComponent()/draw() 中創建一個新關卡時,假設該關卡沒有關聯的房間是否正確? 在這種情況下,該方法無需繪制任何內容即可返回。
如果您的應用程序認為應該更新屏幕,請調用 repaint(),因為框架很快就會調用 paint() 方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.