«Основной» вопрос заключается в том, что вы нарушаете требования цепочки краски ...
public void paintComponent(Graphics window)
{
Graphics2D g2d = (Graphics2D)window;
g2d.translate(360,800);
fern(window);
}
Реализация super
*1004* делает что-то важное, если вы не готовычтобы взять на себя эту ответственность, вы должны убедиться, что вы звоните super.paintComponent
сначала
Вам не помогает ...
frame.setSize(800,800);
frame.setLocation(300,0);
frame.setResizable(false);
frame.setLayout(null);
panel.setSize(800,800);
panel.setOpaque(true);
Вы должны оставить значение по умолчанию BorderLayout
это сделает вашу жизнь намного проще.
Просто обновив BarnsleyFern
, чтобы переопределить getPreferredSize
, вы получите гораздо более гибкое решение.Это означает, что pack
окно и доступный размер контента будут являться предпочтительным размером контента, в отличие от размера окна МИНУС украшения кадра.
public class BarnsleyFern extends JPanel {
//...
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 800);
}
На основе ...
ActionListener action = new ActionListener() {
public void actionPerformed(ActionEvent event) {
repaint();
}
};
Timer timer = new Timer(100, action);
//timer.start();
Я подозреваю, что вы надеетесь получить составную краску, где свойства x
/ y
обновляются в каждом цикле рисования.
Ну, это не сработаетпо ряду причин.Вы нашли один.Graphics
является общим ресурсом, каждый компонент, окрашенный в данном цикле рисования, будет использовать один и тот же экземпляр Graphics
, это означает, что вы можете получить грязные краски (и, как побочный эффект, результат, который вы, похоже, ищете)Но, как вы обнаружили, это не всегда работает.
Рисование также может происходить по ряду причин, многие из которых без вашего ведома или ведома.
Рисование должно отображать текущее состояние, но не должно изменять его.Это то, что должен делать ваш Timer
.
Вам нужно разработать модель, которая будет допускать постепенное изменение каждый раз, когда Timer
тикает, компонент затем будет использовать модель, чтобы просто нарисовать текущее состояние.
Я бы порекомендовал прочитать:
для получения более подробной информации