按下按钮时在同一个画布上绘制多个形状

时间:2013-06-11 23:00:11

标签: java swing drawing awt factory-pattern

按下对应按钮时,我需要绘制正方形,直线,圆形。我还需要使用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;

    }   
}

1 个答案:

答案 0 :(得分:4)

建议:

  • 工厂不应该创建GUI,不应该扩展Canvas,或者真正扩展任何东西,它不应该创建JFrame或做任何类型的事情。它应该只关注创建Shape子类的对象。 GUI创建代码应该在其他地方。
  • 可能工厂的getFigure(...)方法会产生这种方法。它应该接受一个参数,可能是一个String或一个枚举,它告诉它要生成什么样的Shape子类。
  • Shape的draw方法应该接受Graphics参数,以便其子级可以使用它来绘制。
  • 您不应该不必要地将AWT组件(即Canvas)和Swing组件混合在一起。相反,只需绘制JPanel的paintComponent(Graphics g)方法,而不是Canvas的paint(Graphics g)方法。
  • 因为JPanel有一个未初始化的Shape变量,可能称为shape。
  • paintComponent(...)内部检查shape是否为null。如果没有,请拨打shape.draw(g)
  • 来绘制它
  • 在JButton ActionListeners中,让Factory创建一个Shape子类对象并将其分配给形状变量
  • 然后在执行绘图的JPanel上调用repaint()