java - para - manual de programacion android pdf
Dibujar múltiples JComponentes en un marco (2)
pero parece que se sobrescriben entre sí.
El administrador de diseño predeterminado para un JFrame es un BorderLayout. De manera predeterminada, está agregando todos sus componentes al CENTRO de BorderLayout. Sin embargo, solo puede agregar un componente al CENTRO para que solo se muestre el último automóvil.
Cambie el Administrador de diseño a FlowLayout para ver la diferencia.
O bien, parece que está intentando pintar los autos en posiciones aleatorias, en cuyo caso debe usar un diseño "nulo". Entonces usted será responsable de establecer el tamaño / ubicación de cada uno de los componentes del automóvil.
Estoy tratando de dibujar múltiples objetos de automóvil en la misma ventana, pero parece que se sobrescriben entre sí.
Aquí está mi método paintComponent redefinido en la clase Car
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setColor(wheelColor);
g2.fill(leftWheel);
g2.fill(rightWheel);
g2.setColor(bodyColor);
g2.fill(body);
g2.fill(cab);
}
Y en mi clase de espectador:
JFrame f = new JFrame();
initializeFrame(f);
Car x = new Car(100, 100);
Car y = new Car(300, 300);
f.add(x);
f.add(y);
Aunque las coordenadas parecen ser diferentes, solo se dibuja el último automóvil.
¿Alguna sugerencia? Gracias
Lo que quiere hacer es usar una estructura de datos de objetos de Car
y recorrerlos en el método paintComonent
. Algo como
List<Car> cars = new ArrayList<>();
....
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Car car : cars) {
car.drawCar(g);
}
}
El método drawCar
vendría de tu clase de Car
public class Car {
int x, y;
public Car(int x, int y) {
this.x = x;
this.y = y;
}
public void drawCar(Graphics g) {
g.setColor(Color.BLACK);
// do everything here as you would in a paintComponent method
}
}
Vea más ejemplos aquí y aquí y aquí y aquí y aquí y aquí .
ACTUALIZAR
Aquí hay un ejemplo simple de usar algunos "Ferraris" que elevé, también usando algunas animaciones, pero con los mismos puntos básicos que tengo arriba.
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class DrawCar extends JPanel{
private static final int D_W = 400;
private static final int D_H = 400;
List<Car> cars;
public DrawCar() {
cars = new ArrayList<>();
cars.add(new Car(100, 300));
cars.add(new Car(200, 100));
Timer timer = new Timer(50, new ActionListener(){
public void actionPerformed(ActionEvent e) {
for (Car car : cars) {
car.move();
repaint();
}
}
});
timer.start();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Car car : cars) {
car.drawCar(g);
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(D_W, D_H);
}
public class Car {
private static final int INCREMENT = 5;
int x, y;
public Car(int x, int y) {
this.x = x;
this.y = y;
}
public void drawCar(Graphics g) {
g.setColor(Color.BLUE);
g.fillRect(x, y, 100, 30);
g.setColor(Color.BLACK); // body
g.fillOval(x + 15, y + 20, 15, 15); // wheel
g.fillOval(x + 60, y + 20, 15, 15); // wheel
g.fillRect(x + 15, y - 20, 60, 20); // top
}
public void move() {
if (x == D_W) {
x = 0;
} else {
x += INCREMENT;
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();
frame.add(new DrawCar());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}