我有一个主类和一个子类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 '创造了?但似乎这不起作用。
答案 0 :(得分:4)
您的代码令人困惑,我建议您进行简化。
问题:
drawCircle
。不需要时不要嵌套类,而是给绘图组件提供独立的类。paint
而不是paintComponent
。这带来了两个问题(当你后来尝试这样做时生涩的动画)和风险(绘画也会影响组件的子组件和边框绘图)。而是(再次)创建一个扩展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());
}
}