【问题标题】:why is my java rendering engine not updating the window?为什么我的 java 渲染引擎没有更新窗口?
【发布时间】:2021-09-17 11:21:09
【问题描述】:

我正在为游戏制作渲染器,一切正常,但 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 确保渲染器正确排序对象。

感谢您的帮助。

【问题讨论】:

  • 1) 类名应以大写字符开头。并且不要使用“Canvas”,这是一个 AWT 类。使用更具描述性的名称。 2) 组件应该在框架可见之前添加到框架中 3) 绘画方法不应该改变类的状态。那就是你不应该清除 ArrayLIist,只绘制 ArrayList 中包含的任何内容。 4) 你不应该使用静态变量和方法。阅读Custom Painting 上的 Swing 教程以获取更多信息和工作示例。
  • 重申camickr所说的:从你的绘画方法中删除objects.clear();。您无法控制绘画发生的频率。它可以由任意数量的用户操作引起,例如移动窗口、降低或升高窗口,甚至将鼠标移到窗口上。在您的程序逻辑中清除该列表,而不是在绘画方法中。

标签: java swing jpanel


【解决方案1】:

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

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

在主要更新中:

f.repaint();

【讨论】:

  • 执行上述建议后,您仍然需要调用fillRect(...),而不是drawRect(...)。 JComponent 没有任何默认的自定义绘制,因此您需要自己清除背景。
猜你喜欢
  • 2013-07-30
  • 2014-08-20
  • 2020-03-02
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 2013-06-08
  • 1970-01-01
相关资源
最近更新 更多