Java不会从另一个类中绘制paintComponent

时间:2017-10-29 15:11:55

标签: java swing paint

我有一个主类和一个子类Circle,里面有一个paintComponent方法。我试图将该方法调用到我的主类来绘制圆圈,但没有任何东西会出现,我不知道为什么?

My Circle课程:

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内部类创建一个新对象,将其添加到mainPanel,以便我的Jframe输出我的mainPanel内容,这些内容应该是新的Circle对象I '创造了?但似乎这不起作用。

1 个答案:

答案 0 :(得分:4)

您的代码令人困惑,我建议您进行简化。

问题:

  • 您正在不必要地使用内部类drawCircle。不需要时不要嵌套类,而是给绘图组件提供独立的类。
  • 您正在创建绘图组件,但从不将其添加到GUI。如果不将它添加到顶级窗口,这里是JFrame,它将永远不会显示。 修改:您实际上正在添加它,但其首选大小为0,0
  • 您将覆盖paint而不是paintComponent。这带来了两个问题(当你后来尝试这样做时生涩的动画)和风险(绘画也会影响组件的子组件和边框绘图)。
  • 您的绘图组件没有设置首选大小,因此它的大小将设置为[0,0],这不利于显示其绘图。

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

一个小问题:您需要学习并使用Java naming conventions。变量名都应以较低的字母开头,而类名以大写字母开头。了解并遵循这一点将使我们能够更好地理解您的代码,并使您能够更好地理解其他代码。

轻微的狡辩2:你的射线场(大概以半径命名)应称为“直径”,因为它被用作直径,而不是半径。

如,

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