[英]How do you draw an object from another class?
我正在尝试在 java 中制作一张贺卡,它从其他类中绘制对象,并且我可以让我的程序进行编译,只是我从每次绘制中得到的结果 window 只会出现一个空白的灰色屏幕。 我真的不明白 java GUI 是如何工作的,所以任何提示都有帮助。
这是 class 的代码,我正在尝试绘制其 object。 我有一些我还没有使用的方法和变量。
孙class码
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.awt.Color;
public class Sun extends ShapeComponent
{
private double x;
private double y;
private double width;
private double height;
public Sun(double anX, double aY, double w, double h)
{
x = anX;
y = aY;
width = w;
height = h;
}
public void draw(Graphics2D g2)
{
g2.setColor (Color.orange);
g2.fillArc (100,20,80,80,0,360);
g2.drawLine (95,55,75,55);
g2.drawLine (140,105,140,125);
g2.drawLine (140,15,140,0);
g2.drawLine (185,60,205,60);
g2.drawLine (105,35,85,25);
g2.drawLine (120,20,105,5);
g2.drawLine (100,80,80,90);
g2.drawLine (115,100,100,120);
g2.drawLine (175,5,160,20);
g2.drawLine (205,25,175,35);
g2.drawLine (205,90,175,80);
g2.drawLine (175,120,160,100);
}
public void translate(int dx, int dy)
{
x += dx;
y += dy;
}
}
我试图在我的 SceneComponent class 中像这样绘制太阳,但我得到的只是那个没有形状的灰色矩形。
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.Rectangle;
import java.awt.geom.Line2D;
import java.awt.Polygon;
import java.awt.Color;
import java.awt.BasicStroke;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ShapeComponent extends JComponent
{
public ShapeComponent(){
JFrame jf = new JFrame();
jf.setTitle("Greeting Card");
jf.setSize(480, 600);
jf.setVisible(true);
jf.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
}
public void paintComponent(Graphics2D g2){
super.paintComponent(g2);
Sun sun = new Sun(5,65,55,66);
sun.draw(g2);
}
public static void main(String[] args)
{
new ShapeComponent();
}
}
您的paintComponent
方法实际上从未被调用,因此不会绘制太阳。 这是因为paintComponent
方法实际上覆盖了您在声明时创建的 JComponent 的paintComponent
方法
new ShapeComponent();
但是,您在构造函数中创建了一个JFrame
并显示它而不是 JComponent。 简单地说,您重写的paintComponent
方法属于一个不显示的JComponent
。 因此,要解决此问题,您需要覆盖 JPanel 的paintComponent
方法,然后可以将其添加到您创建的 JFrame 中。
一种方法是让您的 ShapeComponent class 扩展JPanel
。 但是,更合适的名称可能是 DrawTest:
public class DrawTest extends JPanel {
public Sun sun;
public DrawTest() {
JFrame f = new JFrame();
f.setTitle(“Greeting Card”);
f.setSize(480, 600);
f.add(this);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initializeShapes();
}
public void initializeShapes() {
sun = new Sun(…);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
sun.draw(g2);
}
public static void main(String[] args) {
new DrawTest();
}
}
在这里, paintComponent
方法重写了 JPanel 的paintComponent
,然后将其添加到 JFrame,它已在构造函数中初始化并显示。
我添加了一个方法来初始化形状,因为在 paintComponent 循环中初始化对象可能会导致不必要的问题,例如,当您想平移太阳时。 此外,如果您想平移,请确保太阳中的绘制方法取决于太阳的位置 x 和 y。
此外,您的 Sun class 不需要扩展 ShapeComponent 或 DrawTest,因此您可以摆脱扩展。 但是,如果您计划拥有多个形状,抽象的 ShapeComponent class 会很有用。 在这种情况下,Sun 可以扩展 ShapeComponent。 如果是这种情况,当您创建 ShapeComponent class 时,它不需要包含框架的任何初始化。 相反,它应该具有诸如 translate 和 draw 之类的方法,哪些子类(如 Sun)可以覆盖这些方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.