我试图在同一个窗口上绘制多个汽车对象,但它们似乎正在相互覆盖。
这是我在Car类中重写的paintComponent方法
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);
}
在我的查看器类中:
JFrame f = new JFrame();
initializeFrame(f);
Car x = new Car(100, 100);
Car y = new Car(300, 300);
f.add(x);
f.add(y);
虽然坐标似乎不同,但只绘制了最后一辆车。
有什么建议吗?谢谢
但它们似乎正在相互覆盖。
JFrame的默认布局管理器是BorderLayout。因此,默认情况下,您将所有组件添加到BorderLayout的中心。但是,您只能将一个组件添加到中心,以便仅显示最后一辆车。
将布局管理器更改为FlowLayout以查看差异。
或者,看起来你试图在随机位置绘制汽车,在这种情况下,你应该使用“空”布局。然后,您将负责设置每个汽车部件的尺寸/位置。
您要做的是使用Car
对象的数据结构,并在PaintComonent
方法中循环遍历它们。类似的东西
List<Car> cars = new ArrayList<>();
....
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Car car : cars) {
car.drawCar(g);
}
}
drawCar方法将来自您的类
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
}
}
请参阅此处、此处、此处、此处、此处和此处的更多示例。
更新
这里是一个简单的例子,使用一些“法拉利”我鞭打,也使用一些动画,但与我上面的基本要点相同。
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);
}
});
}
}
我已经阅读了很多关于绘制Graphics2D组件和添加到JPanel/JFrame的教程,但我无法找到如何简单地将多个这些组件添加到一个JPanel中。我下面的代码只添加了1个组件(行),我不知道为什么不能添加更多。 我到底做错了什么? 期望行为:应有 3 条红线。 我的整个代码:
使用或,我们似乎一次只能在一个文件(或)中绘制一件事。有没有办法将多个图像一个接一个地打印到同一个文件中? 我需要这样的东西: 因此,我只想将列表中包含的所有经过整形的28 x 28图像放在同一个文件中。几个月来,我不得不
我有关于JFrames和J组件的问题。 首先,我们可以将多个JC组件添加到JFrame中吗 第二,如果我们确实向JFrame添加了多个jcomponents,那么当我们想要重新绘制它们时,我们该如何重新绘制它们呢
问题内容: 我知道熊猫支持次要Y轴,但我很好奇是否有人知道将三次Y轴放置在地块上的方法。目前,我正在用numpy + pyplot来实现这一点,但是对于大数据集来说它的速度很慢。 这是为了在同一张图上绘制具有不同单位的不同测量值,以便于比较(例如,相对湿度/温度/和电导率) 所以真的很好奇是否有人在没有太多工作的情况下就能做到这一点。 [编辑]我怀疑是否有办法做到这一点(没有太多的开销),但是我希
我有这个android应用程序。 它使用,从这里我通过获得。 它还使用流媒体视频。但是,我已经实例化了一个,获取它的并传递给。 现在,我在中访问最新的。 我想要操作并将新数据发送到“”表面。 如何将“绘制”到?
我正在制作一个类似飞鸟的飞机游戏,在一个类中,我有移动的背景,然后我将其添加到主jPanel中,它在自己的类中,在另一个类中,我有玩家,我将其添加到主jPanel中。但是,当我将第二个类添加到JPanel时,我添加的第一个类将消失。这是我的背景课: 这是我的平面类:导入java.awt.图形;导入java.awt.event.动作事件;导入java.awt.event.动作监听器;导入java.a