如何从另一个类中绘制对象?

  • 本文关键字:绘制 对象 另一个 java
  • 更新时间 :
  • 英文 :


我正试图在java中制作一张贺卡,从其他类中绘制对象,我可以让我的程序编译,只是我从每次绘制中得到的结果窗口只出现一个空白的灰色屏幕。我不太明白java GUI是如何工作的,所以有什么建议可以帮助我。

这是我试图绘制其对象的类的代码。我有一些方法和变量我还没有使用。

Sun类代码


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类中像这样画太阳,但是我得到的只是一个没有形状的灰色矩形。


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类扩展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中,该JFrame已被初始化并显示在构造函数中。

我添加了一个方法来初始化形状,因为在paintComponent循环中初始化对象可能会导致不必要的问题,例如:你想转换太阳。另外,如果你想转换,确保太阳中的绘制方法依赖于太阳的位置,x和y。

此外,你的Sun类不需要扩展ShapeComponent或DrawTest,所以你可以摆脱扩展。但是,如果您计划拥有多个形状,那么抽象的ShapeComponent类可能会很有用。在这种情况下,Sun可以扩展ShapeComponent。如果是这种情况,当您创建ShapeComponent类时,它不需要包含框架的任何初始化。相反,它应该有像translate和draw这样的方法,这些方法可以被子类(比如Sun)重写。

最新更新