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());
}
}
我有一个主 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());
}
}