如何分组图形对象

时间:2012-07-25 16:01:51

标签: java

如何将多个图形对象转换为一个? (这部分代码应该生成tetris图,其中generate()创建一个图)

public void paint(Graphics g){
        Figure f = generate();
        int length = f.getX()[0].length;
        for(int j =0; j<f.getX().length;j++){

            int xr=xs+10;
            ys = 0;                 
            for(int i=0;i<length;i++){                      

                if (f.getX()[j][i] == 1){
                    int yr = ys+10;
                    Rectangle p = new Rectangle(xs,ys,xr,yr);
                    g.setColor(f.getY());
                    g.drawRect(p.x, p.y, p.width, p.height);    
                    g.fillRect(p.x, p.y, p.width, p.height);    
                    //g.translate(xs+40, ys+40);
                }
                ys+=10;

            }
            xs+=10;
        }
        xs=0;
        ys=0;


       //g.setColor(Color.white);
       //g.drawRect(45, 95, 55, 105);

    }

2 个答案:

答案 0 :(得分:1)

我假设您正在尝试将多个组件放入封闭组件中,以便您可以将它们一起移动/操作。

一个建议是将每个对象添加到面板对象,例如JPanel

然而,你有点不清楚你想要达到的目标。

答案 1 :(得分:1)

好吧,我认为你是从Java 2D开始的,因为你的代码存在一些问题。 首先,你总是需要调用超类的绘画版本。这应该是因为组件需要有机会正确渲染自己。看一看。

@Override
public void paint( Graphics g ) {

    // you MUST do this
    super.paint(g);

    // continue here... 

}

如果您正在处理JFrame,您将覆盖paint方法。如果您正在使用某个JComponent子项,例如JPanel,则需要覆盖paintComponent方法,该方法具有相同的绘制签名,但它受保护,而不是公共。您可以覆盖漆过,但在这些情况下(的JComponent及其子),油漆对代表的油漆工作,以三种方法(的paintComponent,的paintBorder和paintChildren),所以最好的办法是重写paintComponent的方法。

另一个细节。使用图形的最佳方法是创建一个基于当前图形的新图形上下文,并在使用它之后将其处理掉。看看:

@Override
public void paint( Graphics g ) {

    // you MUST do this
    super.paint(g);

    Graphics newG = g.create();
    // or Graphics2D newG2d = (Graphics2D) g.create();

    // do your work here...

    newG.dispose(); // disposes the graphics context

}

使用create方法创建的图形上下文是当前图形上下文的副本(具有相同的状态),但更改它不会影响原始图形上下文,所以这样做,你不会搞乱状态原始图形上下文。

要完成,我认为你需要在你的图中有一个接收图形上下文的draw方法。因此,Figure实例将负责绘制自己。类似的东西:

public class Figure {

    // figure's members...

    public void drawMe( Graphics2D g2d ) {
        // do the draw work here...
    }

}

public class MyFrame extends JFrame {

    @Override
    public void paint( Graphics g ) {

        super.paint(g);

        Graphics2D g2d = (Graphics2D) g.create();

        // let's suppose that figureList is a List<Figure> or a Figure[]
        for ( Figure f : figureList ) {
            f.drawMe( g2d );
        }

        g2d.dispose();

    }

}

当然,如果其绘制方法过于“深入”地更改图形上下文,则可以为每个图创建新的图形上下文,例如进行翻译和旋转。你只需要在使用它们之后处理它们。