簡體   English   中英

Java:JFrame 圖形未繪制矩形

[英]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);
            }   
        }
    }
}

獲取有關該程序的一些背景信息 roomListArrayList ,它充滿了各種不同大小和顏色的房間。 房間本身就是對象

這是第一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()中繪制的房間。

顯示 output 如下所示: 在此處輸入圖像描述

預先感謝!

請注意,每當框架認為組件需要在屏幕上呈現時,Swing 就會調用 paintComponent() 方法。 這通常是當 window 變得可見時 - 最初或因為其他一些 window 不再隱藏組件。 此類事件超出您的控制范圍。

所以你的應用程序應該創建一個 state 並准備好隨時繪制它。 因此,您不要在 paint() 或 paintComponent() 方法中創建 state(如關卡)。 把它放在其他地方——如果需要的話,放在構造函數中。

查看您的代碼:當您在paintComponent()/draw() 中創建一個新關卡時,假設該關卡沒有關聯的房間是否正確? 在這種情況下,該方法無需繪制任何內容即可返回。

如果您的應用程序認為應該更新屏幕,請調用 repaint(),因為框架很快就會調用 paint() 方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM