Метод не определен для типа JPanel

#java #swing #user-interface #jframe #jpanel

Вопрос:

Поэтому я пытаюсь создать простую программу, которая выводит прямоугольник, но у меня возникла эта проблема, и я не знаю, как ее исправить. Вот мой код:

 import java.awt.Color;
import java.awt.Graphics;

import javax.swing.*;

public class GraphicsEditor extends JPanel{
    
    public void drawShape(Graphics g) {
        super.drawShape(g);
        g.setColor(Color.BLUE);
        g.drawRect(100, 100, 120, 150);
    }
    
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        
        GraphicsEditor ga = new GraphicsEditor();
        
        frame.setSize(1280, 720);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
        frame.add(ga);
    }

}
 

Ошибка возникает, когда я пытаюсь добавить super сюда:

 public void drawShape(Graphics g) {
            super.drawShape(g);
            g.setColor(Color.BLUE);
            g.drawRect(100, 100, 120, 150);
        }
 

Ответ №1:

У A JPanel нет drawShape(Graphics) метода, поэтому вызов метода «супер» не имеет смысла. Когда вы думаете, что переопределяете метод, обязательно добавьте @Override обозначения, чтобы получить предупреждение компилятора, когда метод неправильно написан, использует неправильные аргументы или просто полностью отсутствует (как в данном случае).

Правильный способ сделать это-переопределить paintComponent метод, вызвать (существующий) суперметод, а затем немедленно вызвать drawShape метод с Graphics экземпляром, предоставленным paintComponent методу.

Это результат, когда графический интерфейс сокращается:

введите описание изображения здесь

 import java.awt.Color;
import java.awt.Graphics;

import javax.swing.*;

public class GraphicsEditor extends JPanel {
    
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        drawShape(g);
    }
    
    // @Override // does NOT override an existing method! 
    public void drawShape(Graphics g) {
        //super.drawShape(g);
        g.setColor(Color.BLUE);
        g.drawRect(100, 100, 120, 150);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();

        GraphicsEditor ga = new GraphicsEditor();

        frame.setSize(280, 200);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(ga);
    }
}