У меня ОЧЕНЬ простая анимация AWT. Просто играя, чтобы сделать что-то большее. Но не могу заставить его работать...
Случается, что отображается только elypse2 - независимо от перерисовки() или нет.
Я также пытался использовать компоненты Swing вместо AWT (JFrame, JComponent), но это тоже ничего не меняет.
Нужно ли использовать диспетчер компоновки? Но я хочу рисовать только графические компоненты, такие как дуги, прямоугольники, линии, полилинии, aso...
Здесь main():
public static void main(String[] args) {
Frame testFrame = new Frame("Grafx-Test");
testFrame.setSize(300, 200);
testFrame.setAlwaysOnTop(true);
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
testFrame.setVisible(true);
}
});
Elypse elypse = new Elypse(new Point(70, 80), 30, 30, Color.BLUE, false);
testFrame.add(elypse);
Elypse elypse2 = new Elypse(new Point(70, 50), 50, 30, Color.BLUE, true);
testFrame.add(elypse2);
}
и здесь используемый класс:
public class Elypse extends Canvas {
private Point start;
private int width;
private int height;
private Color c;
private boolean filled;
public Elypse(Point start, int width, int height, Color c, boolean filled) {
this.start = start;
this.width = width;
this.height = height;
this.c = c;
this.filled = filled;
}
@Override
public void paint(Graphics g) {
g.setColor(c);
if (filled) {
g.fillOval(start.x, start.y, width, height);
}
else {
g.drawOval(start.x, start.y, width, height);
}
}
}
Вы пренебрегаете pack()
включенным Window
. Обратите внимание на характерный симптом в исходном коде: изменение размера кадра, которое генерирует обновление, вызывает elypse2
.
Добавление. Вы можете увидеть оба экземпляра Elypse
, используя макет, такой как GridLayout
.
testFrame.setLayout(new GridLayout(0, 1));
Как проверено:
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Point;
public class Test {
public static void main(String[] args) {
Frame testFrame = new Frame("Grafx-Test");
testFrame.setAlwaysOnTop(true);
Elypse elypse = new Elypse(new Point(70, 80), 30, 30, Color.BLUE, false);
testFrame.add(elypse);
Elypse elypse2 = new Elypse(new Point(70, 50), 50, 30, Color.BLUE, true);
testFrame.add(elypse2);
testFrame.pack();
testFrame.setVisible(true);
}
private static class Elypse extends Canvas {
private Point start;
private int width;
private int height;
private Color c;
private boolean filled;
public Elypse(Point start, int width, int height, Color c, boolean filled) {
this.start = start;
this.width = width;
this.height = height;
this.c = c;
this.filled = filled;
}
@Override
public void paint(Graphics g) {
g.setColor(c);
if (filled) {
g.fillOval(start.x, start.y, width, height);
} else {
g.drawOval(start.x, start.y, width, height);
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(320, 240);
}
}
}