【问题标题】:Blank screen or cannot find symbol error while drawing car画车时出现黑屏或找不到符号错误
【发布时间】:2016-02-16 18:29:54
【问题描述】:

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

  • super.paintComponent(g) 告诉我找不到符号。
  • drawCar.super.paintComponent(g) 告诉我找不到符号。 (在查看其他错误后尝试了此操作)。
  • drawCar.paintComponent(g) 告诉我“错误:无法从静态上下文引用非静态方法 paintComponent(Graphics)”
  • 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);
            }
        });
    }
}

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

   public class Car extends JPanel
   {
       drawCar car = new drawCar(200);
       private static final int D_W = 400;
       private static final int D_H = 400;


    public class drawCar
    {
        private static final int INCREMENT = 5;
        int x;

        public drawCar(int x)
        {
            x = x;
        }

    public void paintComponent( Graphics g )
    {
        drawCar.paintComponent(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);


    }
   }
 }

【问题讨论】:

  • paintComponentJPanel的受保护方法,不能直接调用,也不应该
  • 你的paintComponentdrawCar的一个方法,没有一个超类有一个叫paintComponent的方法,所以你不能使用super.paintComponent。将Car 添加到任何内容都不会绘制任何内容,因为您不绘制任何内容

标签: swing graphics awt


【解决方案1】:

仔细查看Painting in AWT and SwingPerforming Custom Painting,以更好地了解绘画的工作原理。

您的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);
    }

}

现在,这意味着您可以拥有任意数量的Car 实例并让CarPane 绘制它们(通过将它们添加到List 并让CarPanepaintComponent 方法迭代它)

我强烈建议,您是否专注于设置汽车的基本属性,其原点位于0x0,然后使用Graphics2DAffineTransform 物理更改它的涂漆位置, 对于example

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

【讨论】:

  • 谢谢!这帮助很大。在进入下一部分(让汽车在屏幕上移动)之前,我还在阅读你给我的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多