油漆组件();不工作/被调用

paintComponent(); is not working/ being called

这是我的代码。我对编码有点陌生,所以请多加练习。

public class main extends JPanel{


    public static Window f = new Window();
        public static int Width = 600;
        public static int Hight = 400;
        public static void main(String args[]){ 

            f.setSize(Width, Hight);
            f.setVisible(true);
            f.setResizable(false);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setTitle("FightForYourLife");
            f.setLocationRelativeTo(null);
        }

        public void main(){
            JPanel panel = this;
        }

        public void paintComponent(Graphics g){
            super.paintComponent(g);
            g.setColor(Color.RED);
            g.fillRect(100, 100, 50, 30);
            System.out.println("IT IS PAINTING");
        }



}

一堆问题,但第 1 个:

  • 您永远不会将您的主要对象添加到您的顶级 Window、GUI 等,因为它永远不会添加到 GUI,所以它永远不会显示或呈现,因此 paintComponent永远不会被调用。在您的 public static void main 方法中创建一个新的 Main 对象并将其添加到您的 Window(为什么 Window 而不是 JFrame?)。

其他问题:

  • 您的 class 作为 "pseudo" 构造函数,public void main(){。请记住,构造函数没有 return 类型,不是 void,不是任何东西。所以应该是public main() {.
  • 你的伪构造函数没有任何用处。 JPanel panel = this; ???
  • 您需要遵循 Java 命名规则:class 名称以大写字母开头,字段和方法以小写字母开头。所以 public class main { 应该是 public class Main {
  • 同样,为什么 Window 而不是 JFrame?

例如:

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

// rename main to Main
public class Main extends JPanel{

        public static int WIDTH = 600;
        public static int HEIGHT = 400;

        public static void main(String args[]){ 
            Main main = new Main(); // *** create your main object ***

            JFrame f = new JFrame("FightForYourLife");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(main);  // *** add your main object to the top-level window
            f.pack();  
            f.setResizable(false);
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }

        public Main(){
            // JPanel panel = this; // this is not helpful, delete it
        }

        @Override // let the JPanel size itself.
        public Dimension getPreferredSize() {
            return new Dimension(WIDTH, HEIGHT);
        }

        @Override  // paintComponent should be protected, not public
        protected void paintComponent(Graphics g){
            super.paintComponent(g);
            g.setColor(Color.RED);
            g.fillRect(100, 100, 50, 30);
            System.out.println("IT IS PAINTING");
        }
}