Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java赛车游戏:当我重新绘制汽车对象时,JPanel组件会移动_Java_Swing_Graphics_Jpanel_Paintcomponent - Fatal编程技术网

Java赛车游戏:当我重新绘制汽车对象时,JPanel组件会移动

Java赛车游戏:当我重新绘制汽车对象时,JPanel组件会移动,java,swing,graphics,jpanel,paintcomponent,Java,Swing,Graphics,Jpanel,Paintcomponent,我用我的CarPanel创建了两个汽车对象。然后我使用keylistener重新绘制对象,使其看起来像向前移动。 但问题是整个面板都在移动,尽管我只是增加了到“x”坐标的距离。 如果要调整窗口大小,它有时甚至不会清除组件 public class RacingCars extends JFrame { CarPanel car1; CarPanel car2; //Constructor public RacingCars(){ setLayou

我用我的CarPanel创建了两个汽车对象。然后我使用keylistener重新绘制对象,使其看起来像向前移动。 但问题是整个面板都在移动,尽管我只是增加了到“x”坐标的距离。 如果要调整窗口大小,它有时甚至不会清除组件

public class RacingCars extends JFrame {
    CarPanel car1;
    CarPanel car2;

    //Constructor
    public RacingCars(){
        setLayout(new GridLayout(2,1));
        car1 = new CarPanel('w',Color.RED);
        car2 = new CarPanel('k',Color.blue);

        car1.setBackground(Color.black);
        this.add(car1, BorderLayout.NORTH);
        this.add(car2, BorderLayout.SOUTH);

        this.addKeyListener(new keyListener());
    }

    class keyListener extends KeyAdapter{
        public void keyPressed(KeyEvent e){
            if(e.getKeyChar()=='w'){
                car1.moveCar();
            }
            if(e.getKeyChar()=='k'){
                car2.moveCar();
            }
        }
    }
}
卡帕内尔::

public class CarPanel extends JPanel {

    private char forwardKey = 'w';
    private boolean reachedTarget = false;
    private Color color = Color.blue;
    private int x= 10;
    private int y= 10;

    private int panelWidth;
    private int panelHeight;    

    //default Constructor
    public CarPanel(){      
    }

    //overloaded Constructor
    public CarPanel(char key, Color color){
        this.forwardKey=key;
        this.color = color;
    }

    protected void paintComponent(Graphics g){
        super.paintComponent(g);

        panelWidth= getWidth();
        panelHeight= getHeight();

        //draw a Car
        g.setColor(color);

        //polygon points
        int t_x[]= {x+10,x+20,x+30,x+40};
        int t_y[]= {y+10,y,y,y+10};

        g.fillPolygon(t_x,t_y,t_x.length);
        g.fillRect(x, y+10, 50, 10);
        g.fillArc(x+10, y+20, 10, 10, 0, 360);
        g.fillArc(x+30, y+20, 10, 10, 0, 360);
    }

    @Override
    public Dimension getPreferredSize() {
       return new Dimension(750,100);
    }

    public void moveCar(){
        if(this.x < panelWidth){
            this.x+=10;
            repaint();
        }
    }
}
但问题是整个面板都在移动

不,没有。“绿点”证明了这一点

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class RacingCars extends JFrame {
    CarPanel car1;
    CarPanel car2;

    //Constructor
    public RacingCars(){
        setLayout(new GridLayout(2,1));
        car1 = new CarPanel('w',Color.RED);
        car2 = new CarPanel('k',Color.blue);

        car1.setBackground(Color.black);
        this.add(car1, BorderLayout.NORTH);
        this.add(car2, BorderLayout.SOUTH);

        this.addKeyListener(new MyKeyListener());
    }

    class MyKeyListener extends KeyAdapter{
        public void keyPressed(KeyEvent e){
            if(e.getKeyChar()=='w'){
                car1.moveCar();
            }
            if(e.getKeyChar()=='k'){
                car2.moveCar();
            }
        }
    }

    public static void main(String[] args) {
        //Create the frame on the event dispatching thread
        SwingUtilities.invokeLater(new Runnable(){

            @Override
            public void run() {
                RacingCars rc = new RacingCars();
                rc.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                rc.pack();
                rc.setVisible(true);
            }

        });
    }
}

class CarPanel extends JPanel {

    private char forwardKey = 'w';
    private boolean reachedTarget = false;
    private Color color = Color.blue;
    private int x= 10;
    private int y= 10;

    private int panelWidth;
    private int panelHeight;

    //default Constructor
    public CarPanel(){
    }

    //overloaded Constructor
    public CarPanel(char key, Color color){
        this.forwardKey=key;
        this.color = color;
    }

    protected void paintComponent(Graphics g){
        super.paintComponent(g);

        g.setColor(Color.GREEN);
        g.fillOval(0,0,25,25);

        panelWidth= getWidth();
        panelHeight= getHeight();

        //draw a Car
        g.setColor(color);

        //polygon points
        int t_x[]= {x+10,x+20,x+30,x+40};
        int t_y[]= {y+10,y,y,y+10};

        g.fillPolygon(t_x,t_y,t_x.length);
        g.fillRect(x, y+10, 50, 10);
        g.fillArc(x+10, y+20, 10, 10, 0, 360);
        g.fillArc(x+30, y+20, 10, 10, 0, 360);
    }

    @Override
    public Dimension getPreferredSize() {
       return new Dimension(750,100);
    }

    public void moveCar(){
        if(this.x < panelWidth){
            this.x+=10;
            repaint();
        }
    }
}

import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共级赛车扩展JFrame{
腕板car1;
腕板car2;
//建造师
公共赛车{
setLayout(新网格布局(2,1));
car1=新的腕板('w',颜色为红色);
car2=新卡帕内尔('k',颜色。蓝色);
car1.立根背景(颜色:黑色);
添加(car1,BorderLayout.NORTH);
添加(car2,BorderLayout.SOUTH);
this.addKeyListener(新的MyKeyListener());
}
类MyKeyListener扩展了KeyAdapter{
按下公共无效键(按键事件e){
如果(例如getKeyChar()=='w'){
car1.moveCar();
}
如果(例如getKeyChar()=='k'){
car2.moveCar();
}
}
}
公共静态void main(字符串[]args){
//在事件调度线程上创建框架
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
赛车rc=新赛车();
rc.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
rc.pack();
rc.setVisible(真);
}
});
}
}
类CarPanel扩展了JPanel{
private char forwardKey='w';
私有布尔reachedTarget=false;
私有颜色=Color.blue;
私人整数x=10;
私人智力y=10;
专用内板宽度;
私人内板高度;
//默认构造函数
公共卡帕内尔酒店{
}
//重载构造函数
公共CarPanel(字符键、颜色){
this.forwardKey=key;
这个颜色=颜色;
}
受保护组件(图形g){
超级组件(g);
g、 setColor(Color.GREEN);
g、 圆形(0,0,25,25);
panelWidth=getWidth();
panelHeight=getHeight();
//画一辆汽车
g、 设置颜色(颜色);
//多边形点
int t_x[]={x+10,x+20,x+30,x+40};
int t_y[]={y+10,y,y,y+10};
g、 填充多边形(t_x,t_y,t_x.长度);
g、 fillRect(x,y+10,50,10);
g、 圆角弧(x+10,y+20,10,10,0,360);
g、 圆角弧(x+30,y+20,10,10,0,360);
}
@凌驾
公共维度getPreferredSize(){
返回新维度(750100);
}
公共交通车辆(){
如果(此.x<面板宽度){
这个.x+=10;
重新油漆();
}
}
}
但问题是整个面板都在移动

不,没有。“绿点”证明了这一点

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class RacingCars extends JFrame {
    CarPanel car1;
    CarPanel car2;

    //Constructor
    public RacingCars(){
        setLayout(new GridLayout(2,1));
        car1 = new CarPanel('w',Color.RED);
        car2 = new CarPanel('k',Color.blue);

        car1.setBackground(Color.black);
        this.add(car1, BorderLayout.NORTH);
        this.add(car2, BorderLayout.SOUTH);

        this.addKeyListener(new MyKeyListener());
    }

    class MyKeyListener extends KeyAdapter{
        public void keyPressed(KeyEvent e){
            if(e.getKeyChar()=='w'){
                car1.moveCar();
            }
            if(e.getKeyChar()=='k'){
                car2.moveCar();
            }
        }
    }

    public static void main(String[] args) {
        //Create the frame on the event dispatching thread
        SwingUtilities.invokeLater(new Runnable(){

            @Override
            public void run() {
                RacingCars rc = new RacingCars();
                rc.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                rc.pack();
                rc.setVisible(true);
            }

        });
    }
}

class CarPanel extends JPanel {

    private char forwardKey = 'w';
    private boolean reachedTarget = false;
    private Color color = Color.blue;
    private int x= 10;
    private int y= 10;

    private int panelWidth;
    private int panelHeight;

    //default Constructor
    public CarPanel(){
    }

    //overloaded Constructor
    public CarPanel(char key, Color color){
        this.forwardKey=key;
        this.color = color;
    }

    protected void paintComponent(Graphics g){
        super.paintComponent(g);

        g.setColor(Color.GREEN);
        g.fillOval(0,0,25,25);

        panelWidth= getWidth();
        panelHeight= getHeight();

        //draw a Car
        g.setColor(color);

        //polygon points
        int t_x[]= {x+10,x+20,x+30,x+40};
        int t_y[]= {y+10,y,y,y+10};

        g.fillPolygon(t_x,t_y,t_x.length);
        g.fillRect(x, y+10, 50, 10);
        g.fillArc(x+10, y+20, 10, 10, 0, 360);
        g.fillArc(x+30, y+20, 10, 10, 0, 360);
    }

    @Override
    public Dimension getPreferredSize() {
       return new Dimension(750,100);
    }

    public void moveCar(){
        if(this.x < panelWidth){
            this.x+=10;
            repaint();
        }
    }
}

import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共级赛车扩展JFrame{
腕板car1;
腕板car2;
//建造师
公共赛车{
setLayout(新网格布局(2,1));
car1=新的腕板('w',颜色为红色);
car2=新卡帕内尔('k',颜色。蓝色);
car1.立根背景(颜色:黑色);
添加(car1,BorderLayout.NORTH);
添加(car2,BorderLayout.SOUTH);
this.addKeyListener(新的MyKeyListener());
}
类MyKeyListener扩展了KeyAdapter{
按下公共无效键(按键事件e){
如果(例如getKeyChar()=='w'){
car1.moveCar();
}
如果(例如getKeyChar()=='k'){
car2.moveCar();
}
}
}
公共静态void main(字符串[]args){
//在事件调度线程上创建框架
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
赛车rc=新赛车();
rc.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
rc.pack();
rc.setVisible(真);
}
});
}
}
类CarPanel扩展了JPanel{
private char forwardKey='w';
私有布尔reachedTarget=false;
私有颜色=Color.blue;
私人整数x=10;
私人智力y=10;
专用内板宽度;
私人内板高度;
//默认构造函数
公共卡帕内尔酒店{
}
//重载构造函数
公共CarPanel(字符键、颜色){
this.forwardKey=key;
这个颜色=颜色;
}
受保护组件(图形g){
超级组件(g);
g、 setColor(Color.GREEN);
g、 圆形(0,0,25,25);
panelWidth=getWidth();
panelHeight=getHeight();
//画一辆汽车
g、 设置颜色(颜色);
//多边形点
int t_x[]={x+10,x+20,x+30,x+40};
int t_y[]={y+10,y,y,y+10};
g、 填充多边形(t_x,t_y,t_x.长度);
g、 fillRect(x,y+10,50,10);
g、 圆角弧(x+10,y+20,10,10,0,360);
g、 圆角弧(x+30,y+20,10,10,0,360);
}
@凌驾
公共维度getPreferredSize(){
返回新维度(750100);
}
公共交通车辆(){
如果(此.x<面板宽度){
这个.x+=10;
重新油漆();
}
}
}

在开始运行程序时,甚至在您按下任何键之前,您没有额外的空间吗?请查看我最近添加的图片。请a)尝试我的源代码(在调整大小方面没有此类问题)b)注意,表明问题在代码中未显示,除了添加绿点,现有功能保持不变。c) 发布一个(就像我发布的)进一步的帮助。你是对的。我复制了与上面发布的代码完全相同的代码,并粘贴在相同的.java文件中。信息技术