Пустой экран или не может найти ошибку символа при рисовании автомобиля

Вопрос:

Я работаю над проектом для анимации автомобиля, движущегося по всему экрану. Я получил машину, но потом, когда я отредактировал код, чтобы я мог несколько раз позвонить в машину (поместив его внутри класса), теперь он просто дает мне пустой экран или “не может найти символ 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);


}
}
}

Лучший ответ:

Присмотритесь к живописи в AWT и Swing и исполните обычную живопись, чтобы лучше понять, как работает живопись.

Ваш метод paintComponent является методом drawCar, но drawCar не распространяется на все, что можно было бы рисовать (например, JComponent)

Вместо этого вы должны сделать drawCar отдельным классом, который имеет простой метод “paint”, например…

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

Теперь это означает, что вы можете иметь как можно больше экземпляров Car как вам нравится, и рисовать их CarPane (добавив их в List и CarPane метод CarPane paintComponent)

Что я хотел бы предложить, вы концентрируетесь на настройке основных свойств автомобиля с его AffineTransform точкой в 0x0, затем используйте Graphics2D и AffineTransform для физического изменения местоположения, на котором оно написано, например.

Это значительно улучшит производительность и уменьшит общую сложность

Оцените статью
TechArks.Ru
Добавить комментарий