当前位置: 首页 > 知识库问答 >
问题:

Java:JFrame图形不绘制矩形

费辰阳
2023-03-14

各位程序员好,

我在代码中遇到了一个似乎无法破解的小问题。它与Java的Jframe;图形区域有关。我将在下面发布的代码是在一个绘图方法上。其目的是绘制ArrayListroom List中的房间,该房间位于另一个类中,因此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,其中包含各种不同大小和颜色的房间。房间本身就是物体。

首先是级别课程:

public class Level extends Observable {

    private boolean Switch = true;

    public ArrayList<Room> roomList = new ArrayList<Room>(); 

    (...)
}

下面是用于创建房间的类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循环中的代码。我试图切换整数的房间List.size()来测试它是否是循环。,但事实并非如此。可以在for循环之外绘制一个图形。

再说一次,问题不是错误消息,程序只是没有绘制我在方法draw()中指示它绘制的房间。

事先谢谢!

共有1个答案

阳俊德
2023-03-14

请注意,只要框架认为组件需要在屏幕上呈现,Swing就会调用paintComponent()方法。这通常是当窗口开始可见时,或者因为其他窗口不再隐藏组件。这类事件超出了你的控制。

因此,应用程序应该创建一个状态,并随时准备绘制它。因此,不会在paint()或paintComponent()方法内创建状态(如级别)。把它放在别处——如果需要的话,放在构造器中。

看着你的代码:当你正在创建一个新的层次在画组件()/画(),它是正确的假设,这个级别没有房间相关联?在这种情况下,方法是正确的返回没有绘制任何东西。

如果您的应用程序认为屏幕应该更新,请调用repain(),因为知道框架很快就会调用该项方法。

 类似资料:
  • 使用closePath()闭合图形 首先我们用上节课的方法绘制一个矩形。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UT

  • 绘制矩形        点击菜单栏中的“绘制矩形”按钮可以绘制矩形,绘制矩形在数据下载的时候经常要用到,绘制矩形操作及信息与绘制面相同。 修改矩形        添加后可以使用“选中对象”后双击更改面的样式,也可右键“属性”修改线的属性信息。点击属性信息框下方的整体移动(单点修改)键对面进行位置的更改。在“空间信息”栏修改矩形的节点坐标后,需要注意的是修改完可能就不是标准矩形了,要调整。 删除矩形

  • 绘制矩形        点击菜单栏中的“绘制矩形”按钮可以绘制矩形,绘制矩形在数据下载的时候经常要用到,绘制矩形操作及信息与绘制面相同。 修改矩形        添加后可以使用“选中对象”后双击更改面的样式,也可右键“属性”修改线的属性信息。点击属性信息框下方的整体移动(单点修改)键对面进行位置的更改。在“空间信息”栏修改矩形的节点坐标后,需要注意的是修改完可能就不是标准矩形了,要调整。 删除矩形

  • 上一节,我们使用lineTo()方法绘制一个封闭的矩形。其实,canvas的API提供了rect()方法可以绘制矩形。rect()方法是路径方法,它会把指定的矩形添加到当前路径的子路径中。它只添加路径,绘制图形还是由stroke()或fill()方法完成。 除了rect()方法之外,Canvas 的API还提供了三个直接处理矩形的方法: fillRect(x, y, width, height)

  • 本节,我们将学习如何绘制矩形,它也是HTML5的画布API唯一所提供的内置图形。矩形看上去可能不会让你感到兴奋,但是许多应用程序还是以某种方式在使用它,所以你也应该了解它。 图2-1 绘制矩形 绘制步骤 按照以下步骤,在画布的中央绘制一个简单的矩形: 1. 定义2D画布上下文: window.onload  = function(){ var canvas  = document.getEl

  • 矩形是唯一一种可以直接在2D 上下文中绘制的形状。与矩形有关的方法包括fillRect()、strokeRect()和clearRect()。这三个方法都能接收4 个参数:矩形的x 坐标、矩形的y 坐标、矩形宽度和矩形高度。这些参数的单位都是像素。 首先,fillRect()方法在画布上绘制的矩形会填充指定的颜色。填充的颜色通过fillStyle 属性指定,比如: var drawing = do