有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java方法对于类型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) 个答案

  1. # 1 楼答案

    JPanel没有drawShape(Graphics)方法,因此调用“super”方法没有意义。当您认为您正在重写一个方法时,请确保添加@Override符号,以便在该方法拼写错误、使用错误参数或完全不存在时(如此处所示)获得编译器警告

    正确的方法是重写paintComponent方法,调用(现有的)超级方法,然后立即使用提供给paintComponent方法的Graphics实例调用drawShape方法

    这是缩小GUI时的结果:

    enter image description here

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