Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.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
Swing 绘制车辆时出现空白屏幕或找不到符号错误_Swing_Graphics_Awt - Fatal编程技术网

Swing 绘制车辆时出现空白屏幕或找不到符号错误

Swing 绘制车辆时出现空白屏幕或找不到符号错误,swing,graphics,awt,Swing,Graphics,Awt,我正在做一个项目,让汽车在屏幕上移动。我把车造出来了,但当我编辑代码以便可以多次调用该车(将其放入类中)时,它现在只会给我一个空白屏幕或“找不到符号paintComponent”错误。把它说成: super.paintComponent(g)告诉我找不到符号 drawCar.super.paintComponent(g)告诉我找不到符号。(查看其他错误后尝试此操作) paintComponent(g)告诉我“错误:不能从静态上下文引用非静态方法paintComponent(图形)” paint

我正在做一个项目,让汽车在屏幕上移动。我把车造出来了,但当我编辑代码以便可以多次调用该车(将其放入类中)时,它现在只会给我一个空白屏幕或“找不到符号paintComponent”错误。把它说成:

  • super.paintComponent(g)告诉我找不到符号
  • drawCar.super.paintComponent(g)告诉我找不到符号。(查看其他错误后尝试此操作)
  • paintComponent(g)告诉我“错误:不能从静态上下文引用非静态方法paintComponent(图形)”
  • paintComponent(g)编译,但给我一个空白屏幕
  • 删除它会完全编译,但会给我一个空白屏幕
这是我的密码:

   import java.awt.Graphics;
   import java.awt.Polygon;
   import java.awt.Color;
   import javax.swing.*;


public class CarDriver extends JPanel
{
public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new Car());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setSize(800, 800);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

仔细观察并更好地理解绘画是如何工作的


您的
paintComponent
方法是
drawCar
的一种方法,但是
drawCar
并不是从任何可以绘制的东西扩展而来的(比如
JComponent

相反,您应该使
drawCar
成为一个单独的类,它有一个简单的“绘制”方法,例如

public class Car {

    private static final int INCREMENT = 5;
    int x;

    public Car(int x) {
        this.x = x;
    }

    public void paint(Graphics g) {
        // body of the car
        g.setColor(Color.blue);
        int xValues[] = {x + 80, x + 80, x + 180, x + 180};
        int yValues[] = {60, 120, 120, 60};
        Polygon polygon1 = new Polygon(xValues, yValues, 4);
        g.fillPolygon(polygon1);

        //hood / front end of car
        int xValues2[] = {x + 180, x + 200, x + 200};
        int yValues2[] = {60, 60, 90};
        g.drawPolyline(xValues2, yValues2, 3);
        int xValues2a[] = {x + 180, x + 180, x + 220, x + 220};
        int yValues2a[] = {90, 120, 120, 90};
        Polygon polygon3 = new Polygon(xValues2a, yValues2a, 4);
        g.fillPolygon(polygon3);

        //cartop
        g.setColor(Color.black);
        int xValues3[] = {x + 90, x + 90, x + 170, x + 170};
        int yValues3[] = {45, 60, 60, 45};
        Polygon polygon2 = new Polygon(xValues3, yValues3, 4);
        g.fillPolygon(polygon2);

        //wheels
        g.fillOval(x + 80, 100, 35, 35);
        g.fillOval(x + 180, 100, 35, 35);

    }
}
public class CarPane extends JPanel {

    Car car = new Car(200);
    private static final int D_W = 400;
    private static final int D_H = 400;

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        car.paint(g);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(D_W, D_H);
    }

}
然后您可以创建一个能够实际绘制它的组件,例如

public class Car {

    private static final int INCREMENT = 5;
    int x;

    public Car(int x) {
        this.x = x;
    }

    public void paint(Graphics g) {
        // body of the car
        g.setColor(Color.blue);
        int xValues[] = {x + 80, x + 80, x + 180, x + 180};
        int yValues[] = {60, 120, 120, 60};
        Polygon polygon1 = new Polygon(xValues, yValues, 4);
        g.fillPolygon(polygon1);

        //hood / front end of car
        int xValues2[] = {x + 180, x + 200, x + 200};
        int yValues2[] = {60, 60, 90};
        g.drawPolyline(xValues2, yValues2, 3);
        int xValues2a[] = {x + 180, x + 180, x + 220, x + 220};
        int yValues2a[] = {90, 120, 120, 90};
        Polygon polygon3 = new Polygon(xValues2a, yValues2a, 4);
        g.fillPolygon(polygon3);

        //cartop
        g.setColor(Color.black);
        int xValues3[] = {x + 90, x + 90, x + 170, x + 170};
        int yValues3[] = {45, 60, 60, 45};
        Polygon polygon2 = new Polygon(xValues3, yValues3, 4);
        g.fillPolygon(polygon2);

        //wheels
        g.fillOval(x + 80, 100, 35, 35);
        g.fillOval(x + 180, 100, 35, 35);

    }
}
public class CarPane extends JPanel {

    Car car = new Car(200);
    private static final int D_W = 400;
    private static final int D_H = 400;

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        car.paint(g);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(D_W, D_H);
    }

}

现在,这意味着您可以拥有任意多个
Car
实例,并让
CarPane
绘制它们(通过将它们添加到
列表中,并让
CarPane
paintComponent
方法对其进行迭代)

我强烈建议您集中精力设置汽车的基本属性,使其原点位于
0x0
,然后使用
Graphics2D
AffineTransform
物理更改其喷漆位置,例如


这将大大提高性能并降低总体复杂性

paintComponent
JPanel
的受保护方法,您不能直接调用它,也不应该直接调用它。您的
paintComponent
drawCar
的方法,没有超类具有名为
paintComponent
的方法,因此不能使用
super.paintComponent
。向任何东西添加
Car
都不会画任何东西,因为你不会“画任何东西”!这帮了大忙。在进入下一部分(使汽车在屏幕上移动)之前,我还在阅读您给我的链接。