0

按下对应按钮时,我需要画一个正方形、直线、圆形。我还需要使用 FactoryMethod 设计模式来做到这一点。我根本不知道如何在同一个画布上绘图,而且因为我对每个形状都有一个类,我如何获得相应的 paint(Graphics g) 方法?这是我到目前为止所拥有的:

public interface Shape

{

          public void draw();

}

方班

public class Square extends Canvas implements Shape
{
    Graphics g;

    Canvas c;

    public Canvas getCanvas()
    {
        return c;
    }
    public void setCanvas(Canvas c)
    {
        this.c=c;
    }
    @Override
    public void draw() 
    {
        g.drawRect(20, 30,100,100);

    }
    public void paint(Graphics g)
    {
        g.drawRect(20, 30,100,100);
        g.setColor(Color.BLUE);
    }


}

工厂

public class ClassFactory extends Canvas{

    JButton patrat;
    Figura d;
    String nameButon;
    Graphics g;
    Canvas c;
    public Canvas getCanvas()
    {
        return c;
    }
    public void setCanvas(Canvas c)
    {
        this.c=c;
    }
    public ClassFactory()
    {
        super();
        this.setBounds(0,0,500,450);
        this.setBackground(Color.CYAN);
        JButton square=new JButton("square");
        patrat.setBounds(510, 10, 80,25);

        JPanel panel=new JPanel();
        panel.setLayout(null);
        panel.setBounds(0,0,600,500);
        panel.setBackground(Color.GRAY);
        panel.add(this);
        this.addComponentListener(p);
        panel.add(square);

        JFrame f=new JFrame("Draw");
        f.setLayout(null);
        f.setBounds(50,50,700,600);
        f.getContentPane().setBackground(Color.DARK_GRAY);
        f.setResizable(false);
        f.add(panel);

        f.show();
           }

    public Shape getFigure()
    {
        Shape d=null;
        if(nameButton.equals("square"))
        {
            d=new Square();
        }
        return d;

    }   
}
4

1 回答 1

4

建议:

  • 工厂不应创建 GUI,不应扩展 Canvas,或真正扩展任何东西,不应创建 JFrame 或做任何类似的事情。它应该只关心创建 Shape 子类的对象。GUI 创建代码应该在别处。
  • 可能工厂的getFigure(...)方法将是生产这个的方法。它可能应该接受一个参数,可能是一个字符串或一个枚举,告诉它要生成什么形状的子类。
  • Shape 的 draw 方法应该可能接受一个 Graphics 参数,以便它的子级可以使用它来绘制。
  • 您不应该将 AWT 组件(即 Canvas)和 Swing 组件不必要地混合在一起。相反,只需在 JPanel 的方法中绘制paintComponent(Graphics g),而不是在 Canvas 的paint(Graphics g)方法中。
  • 在那个 JPanel 中有一个未初始化的 Shape 变量,可能称为 shape。
  • 检查paintComponent(...)形状是否为空。如果没有,请调用shape.draw(g).
  • 在您的 JButton ActionListeners 中,让 Factory 创建一个 Shape 子类对象并将其分配给 shape 变量
  • 然后调用repaint()进行绘图的 JPanel。
于 2013-06-11T23:13:34.627 回答