如何将多个图形对象转换为一个? (这部分代码应该生成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);
}
答案 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();
}
}
当然,如果其绘制方法过于“深入”地更改图形上下文,则可以为每个图创建新的图形上下文,例如进行翻译和旋转。你只需要在使用它们之后处理它们。