0

如何将多个图形对象合二为一?(这部分代码应该生成俄罗斯方块图,其中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);

    }
4

2 回答 2

1

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

@Override
public void paint( Graphics g ) {

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

    // continue here... 

}

如果您正在处理 JFrame,您将覆盖 paint 方法。如果您正在使用一些 JComponent 子组件,例如 JPanel,您需要重写paintComponent 方法,该方法具有相同的paint 签名,但它是受保护的,而不是公共的。您也可以覆盖paint,但在这些情况下(JComponent 及其子项),paint 是一种将绘制工作委托给三个方法(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();

    }

}

当然,如果每个 Figure 的 draw 方法改变了图形上下文太“深”,你可以为每个图形创建一个新的图形上下文,比如做平移和旋转。您只需要在使用后处理新的。

于 2012-07-25T16:21:18.717 回答
1

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

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

但是,您要确切实现的目标尚不清楚。

于 2012-07-25T16:04:50.937 回答