Я работаю над программой, которая отображает анимацию с использованием архитектуры 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