Java 不会从另一个绘制 paintComponent class

Java Won't draw paintComponent from another class

我有一个主 class 和一个子 class 圆,其中有一个 paintComponent 方法。我正在尝试将该方法调用到我的主要 class 以绘制圆,但什么也不会出现,我不确定为什么?

我的圈子class:

public class Circle extends Shape {
Integer rad;

public Circle(int posx,int posy, int rad) {
    this.posx = posx;
    this.posy = posy;
    this.rad = rad;
}

class drawCircle extends JPanel {
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(Color.green);
        g.fillOval(posx,posy,rad,rad);
    }
  }
}

我的主要方法片段

public class drawFrame extends JFrame {
JPanel panel1;
JPanel panel2;
Square square1;
Circle circle1;



public drawFrame() {

    panel2= new JPanel();
    panel1= new JPanel();

 int rad = 0;
    circle1 = new Circle(posx, posy,rad);
    Circle.drawCircle drawCi = circle1.new drawCircle();
    add(panel1, BorderLayout.CENTER);
    panel1.add(drawCi);

基本上我只是给出了代码主要部分的一些片段。我尝试做的是从 Circle drawCircle inner class 创建一个新对象,将它添加到 mainPanel,这样我的 Jframe 输出我的 mainPanel 内容应该是我创建的新 Circle 对象?不过好像不行。

你的代码很混乱,我建议简化。

问题:

  • 您不必要地使用了内部 class、drawCircle。不要在不需要时嵌套 classes,而是给绘图组件一个独立的 class.
  • 您正在创建绘图组件,但从未将其添加到 GUI。如果不将它添加到顶级 window,这里是 JFrame,它将永远不会显示。 编辑:您实际上是在添加它,但它的首选大小是 0,0
  • 您正在覆盖 paint 而不是 paintComponent。这会带来问题(稍后尝试执行此操作时会出现不稳定的动画)和风险(绘制也会影响组件的子组件和边框绘制)。
  • 您的绘图组件没有设置首选尺寸,所以它会尺寸为[0,0],这不利于显示它的绘图。

而是(再次)创建一个独立的、非嵌套的 class 来扩展 JPanel,在您绘制圆的地方覆盖它的 paintComponent 并确保将它添加到显示的 JFrame 中。还可以设置绘图组件的首选大小或覆盖其 getPreferredSize() 方法。当然一定要pack()添加组件后的JFrame,打包后调用setVisible(true)

一个小问题:你会想要学习和使用Java naming conventions。变量名称应全部以小写字母开头,而 class 名称应以大写字母开头。了解并遵循这一点将使我们能够更好地理解您的代码,并使您能够更好地理解其他人的代码。

小问题 2:你的辐射场(大概以半径命名)应该被称为 "diameter" 因为它被用作直径,而不是半径。

例如,

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.*;

@SuppressWarnings("serial")
public class DrawCircle extends JPanel {
    private static final int PANEL_WIDTH = 600;
    private static final Color CIRCLE_COLOR = Color.GREEN;
    private int posx;
    private int posy;
    private int diameter;

    public DrawCircle(int posx, int posy, int diamter) {
        setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_WIDTH));
        this.posx = posx;
        this.posy = posy;
        this.diameter = diamter;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        // for smooth graphics
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setColor(CIRCLE_COLOR);
        g2.fillOval(posx, posy, diameter, diameter);
    }

    private static void createAndShowGui() {
        DrawCircle mainPanel = new DrawCircle(100, 100, 400);

        JFrame frame = new JFrame("DrawCircle");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}