gpt4 book ai didi

Java 图形只覆盖新形状?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:11 26 4
gpt4 key购买 nike

我正在开发一个使用 MVC 架构显示动画的程序。该模型包含形状并告诉它们自己发生变异。有问题的 View 是一个扩展 JPanel 的类。它接受来自 Controller 的形状并将它们放置在 paintComponent 中的 Graphics 对象上。 Controller 在其 run 方法中有一个 while 循环,告诉模型改变所有形状,将这些形状推送到 View ,然后让线程 hibernate 一定时间。

但是,我遇到的问题是:Graphics 对象似乎只是为每个 paintComponent 调用覆盖新形状,这样您就可以在整个过程中看到形状的踪迹整个程序的运行。这只是 View 扩展 JPanel 时的一个问题(程序在以前的实现中运行良好,这是一个具有匿名 JPanel 类的 JFrame),而且似乎只是我的 Linux 机器上的问题(我的项目合作伙伴使用 macbook - - 标记 Linux 因为它可以绑定(bind)到 Linux 平台)。此外,我已经尝试使用 Oracle jdk8、open-jdk8 和 open-jdk10。

我确定这只是我的代码中的一个错误,因为其他程序可以正常工作。会不会是linux jdk发现了,macOS找不到的bug?

我会尽我最大的努力去做伪代码,这样我就不会因为抄袭而被停靠

当前代码:

public class MyVisualView extends JPanel implements MyViews {
// store my shapes with name shapes
public MyVisualView() {
JFrame frame = new JFrame();
frame.setSize(width, height);
frame.setResizable(false);

frame.getContentPane().add(this);
frame.setLocationRelativeTo(null);
frame.setVisible(true);

// tried these individually -- didn't work
this.setOpaque(true);
this.setBackground(Color.WHITE);
}

@Override
public void paintComponent(Graphics g) {
for (all of my shapes) {
g.setColor(shape color);
if (oval) g.fillOval(...);
else g.fillRect(...);
}
}
}

以前的代码,有效:

public class MyVisualView extends JFrame implements MyViews {
public void run() {
shapes = getShapes();

JPanel panel = new JPanel() {
@Override
public void paintComponent(Graphics g) {
// same paintComponent as above
}
};

while (true) {
panel.repaint();
// wait for a certain amount of time
}
}
}

编辑:通过重新绘制 JFrame 而不是 JPanel 解决了这个问题

最佳答案

However, the problem I'm running into is this: the Graphics object seems to be simply overlaying the new shapes for every paintComponent call

@Override
public void paintComponent(Graphics g) {
for (all of my shapes) {

代码应该是:

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (all of my shapes) {

在重新绘制所有形状之前,您需要先调用面板的默认绘制以清除背景。

还有:

while (true) {
panel.repaint();

不要为动画使用 while (true) 循环。相反,您应该使用 Swing Timer 来安排动画。

看看 Swing Tutorial .有以下部分:

  1. Custom Painting -(即,您还应该覆盖 getPreferredSize() 方法)
  2. 如何使用 Swing 定时器

让您开始了解 Swing 的每个功能的基础知识。

关于Java 图形只覆盖新形状?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53366169/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com