Java 在两个不同的JPanel上绘制组件坐标
我需要做一个程序,在每个img上有两辆车,有16个不同的位置(22.5%旋转)。他们需要在跑道(矩形)上比赛。问题是我不能让汽车在不同的位置启动Java 在两个不同的JPanel上绘制组件坐标,java,swing,timer,jpanel,paintcomponent,Java,Swing,Timer,Jpanel,Paintcomponent,我需要做一个程序,在每个img上有两辆车,有16个不同的位置(22.5%旋转)。他们需要在跑道(矩形)上比赛。问题是我不能让汽车在不同的位置启动 import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
public class LogoAnimatorJPanel extends JPanel{
protected ImageIcon carImages[];
private final int numberOfImages = 16;
private int currentImage = 0;
private Timer spinTimer;
private String color;
private int gX = 375, gY = 500, sX = 375, sY = 550;
public LogoAnimatorJPanel(String carColor) {
carImages = new ImageIcon[numberOfImages];
for(int i=0; i<carImages.length;i++){
carImages[i] = new ImageIcon( getClass().getResource("Images/"+carColor+"Car/" + i +".PNG" ) );
}
this.setPreferredSize(new Dimension(50,50));
color = carColor;
}
public void startAnimation(int ANIMATION_DELAY){
if(spinTimer == null){
currentImage = 0;
spinTimer = new Timer(ANIMATION_DELAY, new TimerHandler());
spinTimer.start();
}
else{
if(!spinTimer.isRunning()){
spinTimer.restart();
}
}
}
public void myPaint(Graphics g){
if("Green".equals(color)){
carImages[ currentImage ].paintIcon( this, g, gX, gY );
}
if("Silver".equals(color)){
carImages[ currentImage ].paintIcon( this, g, sX, sY );
}
}
@Override
public void paintComponent( Graphics g ){
super.paintComponent( g );
g.setColor( Color.GREEN );
g.fillRect( 150, 200, 550, 300 ); //grass
g.setColor( Color.BLACK );
g.drawRect(50, 100, 750, 500); // outer edge
g.drawRect(150, 200, 550, 300); // inner edge
g.setColor( Color.YELLOW );
g.drawRect( 100, 150, 650, 400 ); // mid-lane marker
g.setColor( Color.WHITE );
g.drawLine( 425, 500, 425, 600 ); // start line
myPaint(g);
carImages[ currentImage ].paintIcon( this, g, gX, gY ); COMMENTED OUT (currently)
if ( spinTimer.isRunning() )
currentImage = (currentImage+1) % carImages.length;
}
public void stopAnimation(){
spinTimer.stop();
}
private class TimerHandler implements ActionListener {
@Override
public void actionPerformed(ActionEvent actionEvent){
repaint();
}
}}
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JFrame;
public class LogoAnimator {
public static void main(String[] args) {
JFrame window = new JFrame("Wacky Racing");
LogoAnimatorJPanel carGreen = new LogoAnimatorJPanel("Green");
window.add(carGreen); --->>> the order of this
LogoAnimatorJPanel carSilver = new LogoAnimatorJPanel("Silver");
window.add(carSilver); ----->>>> and this seems to cause the problem
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLocation(300, 250);
window.setSize(850, 750);
window.setResizable(false);
window.setVisible(true);
carGreen.startAnimation(50);
carSilver.startAnimation(100);
}}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.ImageIcon;
导入javax.swing.JPanel;
导入javax.swing.Timer;
公共类LogoAnimatorJPanel扩展了JPanel{
受保护的图像图标carImages[];
私人最终int numberOfImages=16;
私有int currentImage=0;
私人定时器;
私有字符串颜色;
私人int gX=375,gY=500,sX=375,sY=550;
公共标识AnimatorJPanel(字符串carColor){
carImages=新图像图标[numberOfImages];
对于(int i=0;i>>此
LogoAnimatorJPanel carSilver=新LogoAnimatorJPanel(“银色”);
window.add(carSilver);------>>>>这似乎是问题的原因
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
窗口设置位置(300250);
窗口设置大小(850750);
window.setresizeable(false);
window.setVisible(true);
carGreen.startAnimation(50);
carSilver.startAnimation(100);
}}
我似乎无法使这两辆车有不同的坐标。
有什么解决方案吗?您正在硬编码车辆的坐标,使其与所有车辆使用这些值作为其位置的坐标相同:
private int gX = 375, gY = 500, sX = 375, sY = 550;
所以我对你遇到这个问题并不感到惊讶。也许你想创建一个Car类,一个保存汽车位置和图像图标的类,并将每个汽车对象设置为不同的位置