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);
            }   
        }
    }
}

获取有关该程序的一些背景信息roomListArrayList,它充满了各种不同大小和颜色的房间。房间本身是 objects.

先到先得Levelclass:

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() 方法将很快被框架调用。