Перерисовка элементов Java Swing
Доброго времени суток!
У меня есть JPanel. На ней отрисовываются 2 разных объекта, которые меняют своё местоположение. Меняют они своё положение в разные промежутки времени.
Под каждый объект выделен метод. Вот один из методов:
void drawPoint(Point point) {
SwingUtilities.invokeLater(() -> {
Graphics g = getGraphics();
g.drawImage(getImage(), point.getX(), point.getY(), this);
});
}
При таком раскладе он рисует дополнительные элементы, не стирая старые. Но если добавить перед g.drawImage():
super.paintComponent(g);
то один из объектов рисуется как надо, но при этом стирается второй. Если оба метода будут использовать super.paintComponent(g), то тоже ничего не выйдет.
Так вот сам вопрос: Как можно их отрисовывать корректно по отдельности, при условии что это надо делать в разные промежутки времени: один чаще , другой реже? И возможно ли это вообще?
Ответы (1 шт):
Метод paintComponent(g) перерисовывает весь компонент. Он может быть вызван самой JVM в любое время когда это необходимо, например, при изменении размера окна.
Вызывая super.paintComponent(g) перед g.drawImage() ты стираешь все что было до этого, соответственно, первый/второй объект стирается и ты рисуешь новый объект.
Как вариант, ты можешь переопределить метод paintComponent(g) у JPanel и писать код для отрисовки объектов там. Для всех объектов. После в нужный момент, когда какой-нибудь объект меняет свое положение вызывать метод repaint() у JPanel.
Например,
class MyPanel extends JPanel {
private Point point1;
private Point point2;
MyPanel() {
super();
point1 = new Point(0, 0);
point2 = new Point(270, 0);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
point1.x += 10;
point1.y += 10;
point2.x -= 10;
point2.y += 10;
MyPanel.this.repaint();
}
}, 0, 500);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawOval(point1.x, point1.y, 10, 10);
g.drawOval(point2.x, point2.y, 10, 10);
}
}
class Window extends JFrame {
Window() {
super("Title");
setSize(300, 300);
setLocationRelativeTo(null);
MyPanel panel = new MyPanel();
getContentPane().add(panel);
}
}
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new Window().setVisible(true);
});
}
}
>