Java图形仅覆盖新形状吗?

时间:2018-11-18 22:41:27

标签: java linux swing

我正在开发一个使用MVC架构显示动画的程序。该模型包含形状,并告诉它们进行变异。所讨论的视图是扩展JPanel的类。它从控制器接受形状并将其放置在paintComponent中的Graphics对象上。控制器的run方法中有一个while循环,它告诉模型改变所有形状,将这些形状推入视图,然后使线程休眠一定时间。

但是,我遇到的问题是:Graphics对象似乎在每个paintComponent调用中都简单地覆盖了新形状,以便您可以在整个运行过程中看到形状的轨迹该程序。这仅在视图扩展JPanel时才有问题(程序对于先前的实现运行良好,该程序是具有匿名JPanel类的JFrame),并且似乎仅在我的Linux机器上有问题(我的项目合作伙伴使用的是macbook- -标记Linux,因为它可能与Linux平台相关联)。另外,我已经在Oracle jdk8,open-jdk8和open-jdk10中进行了尝试。

我确定这只是我代码中的错误,因为其他程序可以工作。难道这是Linux jdk找不到但macOS找不到的bug?

我将尽力去做伪代码,以免抄袭dock窃

当前代码:

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来解决它

1 个答案:

答案 0 :(得分:0)

  

但是,我遇到的问题是:Graphics对象似乎只是为每个paintComponent调用叠加了新形状

@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();

请勿使用一会儿(true)循环进行动画制作。相反,您应该使用Swing计时器来安排动画。

看看Swing Tutorial。关于以下内容:

  1. Custom Painting-(即,您还应该覆盖getPreferredSize()方法)
  2. How to Use Swing Timer

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