swing—为什么我的java渲染引擎不更新窗口?

zmeyuzjn  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(448)

我正在为一个游戏制作渲染器,一切正常,但jpanel不会更新,当它更新时,有时渲染会出现问题。
示例:


以下是渲染帧的代码:

static Container c;
static JFrame f;
static ArrayList<renderable_object> objs = new ArrayList<>();

public void main () {
    Image iconI = Toolkit.getDefaultToolkit().getImage(icon);  

    f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
    f.getContentPane().add(new canvas());
    c = f.getContentPane();
}

class canvas extends JComponent {
    public void paint(Graphics g)
    {
        Dimension size = getSize();
        g.drawRect(0, 0, size.width, size.height);

        for (renderable_object part : objs) {       
            g.setColor(part.c);
            if (part.type == 1) {
                g.drawLine(part.i,part.j,part.k,part.l);
            } else if (part.type == 2) {
                g.drawOval(part.i,part.j,part.k,part.l);
            } else if (part.type == 3) {
                g.drawRect(part.i,part.j,part.k,part.l);
            } else if (part.type == 4) {
                g.drawString(part.name,part.k,part.l);
            }
        }

        objs.clear();
    }
}

class renderable_object {
    int i = 0;
    int j = 0;
    int k = 0;
    int l = 0;

    int type = 0;

    String name = "";

    Color c = new Color(0,0,0);
}

}
arraylist确保渲染器正确地对对象排序。
谢谢你的帮助。

ekqde3dh

ekqde3dh1#

我看到的第一个问题是你没有打电话 super.paint(g); 作为你习惯的第一件事 paint 方法。当使用jcomponent时,您可以使用它内置的双缓冲功能。但是,此功能不适用于 paint 方法,但使用 paintComponent 方法,因此您应该将当前解决方案替换为以下解决方案:

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    // your drawing code here
}

通过使用这种方法,你正在做的整个图像的填充也变得多余,所以你可以忽略它。

相关问题