Java 如何在另一个JPanel中的JPanel上绘制图形2D?

Java 如何在另一个JPanel中的JPanel上绘制图形2D?,java,graphics,jpanel,graphics2d,Java,Graphics,Jpanel,Graphics2d,我想创建4个JPanel,在每个JPanel上绘制一个白色矩形 然后把它们放在一个大的JPanel里。大JPanel在主框架内 但是,以下代码不起作用。请告诉我,如何解决这个问题 import javax.swing.*; import java.awt.Graphics; import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.Rectangl

我想创建4个JPanel,在每个JPanel上绘制一个白色矩形 然后把它们放在一个大的JPanel里。大JPanel在主框架内

但是,以下代码不起作用。请告诉我,如何解决这个问题

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

import java.io.*;
import java.net.*;

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Rectangle2D;
import java.io.IOException;

public class Main extends JFrame
{

public void GUI () {
    setBounds(0, 0, 480, 960);
    addWindowListener(new WindowAdapter(){
        public void windowClosing(WindowEvent we){

            System.exit(0);
            }
        });
        setMinimumSize(new Dimension(480, 960));
        setResizable(false);

        JPanel mainPanel = new JPanel();
        GridLayout GL = new GridLayout(4,0);
        mainPanel.setLayout(GL);

    JPanel panel1 = new MyCanvas();
    JPanel panel2 = new MyCanvas();
    JPanel panel3 = new MyCanvas();
    JPanel panel4 = new MyCanvas();

    mainPanel.add(panel1);
    mainPanel.add(panel2);
    mainPanel.add(panel3);
    mainPanel.add(panel4);

    add(mainPanel);

    setVisible(true);
}

public static void main(String args[]) throws IOException
{
    new Main().GUI();
}

class MyCanvas extends JPanel {

    public void drawCanvas(Graphics g) {

        super.paintComponent( g ); // call superclass's paintComponent  

        Graphics2D g2 = ( Graphics2D ) g; // cast g to Graphics2D  

        g2.setColor(Color.WHITE);

        double x = 100;
        double y = 100;
        double width = x + 200;
        double height = y + 50;

        g2.fillRect(50, 50, 380, 200);
    }
    }
}

这是做什么的

public void drawCanvas(Graphics g) {
  ....
}
此方法不覆盖任何JPanel绘图方法,因此当JVM决定绘制MyCanvas JPanel时,不会经常调用它

我认为您应该重写类的
paintComponent(…)
方法,只需将方法重命名为
paintComponent(…)
即可轻松完成。如果执行此操作,请不要忘记使用
@Override
注释,以确保使用正确的签名重写该方法。您还需要将方法的访问说明符更改为
protected
,而不是
public


接下来,您需要对正在创建的双变量执行一些操作。

这应该执行什么操作

public void drawCanvas(Graphics g) {
  ....
}
此方法不覆盖任何JPanel绘图方法,因此当JVM决定绘制MyCanvas JPanel时,不会经常调用它

我认为您应该重写类的
paintComponent(…)
方法,只需将方法重命名为
paintComponent(…)
即可轻松完成。如果执行此操作,请不要忘记使用
@Override
注释,以确保使用正确的签名重写该方法。您还需要将方法的访问说明符更改为
protected
,而不是
public

接下来,您需要对正在创建的双变量进行处理