繁体   English   中英

你如何从另一个 class 中提取一个 object?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM