Java Graphics только наложение новых фигур? - PullRequest
0 голосов
/ 19 ноября 2018

Я работаю над программой, которая отображает анимацию с использованием архитектуры MVC. Модель содержит фигуры и говорит им мутировать сами. Рассматриваемое представление - это класс, расширяющий JPanel. Он принимает формы от контроллера и помещает их в объект Graphics в paintComponent. Контроллер имеет цикл while в своем методе run, который предписывает модели мутировать все фигуры, выталкивает эти фигуры в представление, а затем засыпает нить в течение определенного времени.

Однако проблема, с которой я сталкиваюсь, заключается в следующем: объект Graphics, похоже, просто накладывает новые фигуры на каждый вызов paintComponent, так что вы можете видеть след фигур на протяжении всего прогона программы. , Это только проблема, когда представление расширяет JPanel (программа работала нормально для предыдущей реализации, которая была JFrame с анонимным классом JPanel), и, похоже, проблема только на моей машине с Linux (мой партнер по проекту использует macbook - - пометка Linux, поскольку она может быть привязана к платформе Linux). Кроме того, я пробовал это с Oracle jdk8, open-jdk8 и open-jdk10.

Я уверен, что это просто ошибка в моем коде, так как другие программы работают. Может ли это быть ошибка, которую находит jdk Linux, но не macOS?

Я сделаю все возможное, чтобы создать псевдокод, чтобы меня не пристыковали к плагиату

текущий код:

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 голосов
/ 19 ноября 2018

Однако проблема, с которой я сталкиваюсь, заключается в следующем: кажется, что объект 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();

Неиспользуйте цикл while (true) для анимации.Вместо этого вы должны использовать Swing Timer для планирования анимации.

Взгляните на Swing Tutorial .Есть разделы:

  1. Custom Painting - (т.е. вы также должны переопределять метод getPreferredSize())
  2. How to Use Swing Timer

чтобы начать знакомство с основами каждой из этих функций Swing.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...