プログラマが、一時的に 1 つまたは 2 つのレンダリング操作に対して小さな領域にクリップを設定し、それをあとで復元したい場合、別の機構を使用する必要があります。現在使用可能な回避策は、create() メソッドの 1 つを使用して Graphics オブジェクトをコピーし、clipRect メソッドを使用して、一時的なクリップを新しい Graphics オブジェクトに設定し、それが終わったときに破棄することです。元の Graphics オブジェクトは、修正前の状態の元のクリップを持っており、それを次回のレンダリングに使用することができます。
さらに、Graphics オブジェクトの他のすべての属性は問い合わせ、変更および元の値への復元ができます。レンダリング属性として表示されるとき、クリップ領域は部分的にしかこの設計モデルに従いません。クリップ領域を Rectangle オブジェクトとして問い合わせるためのメソッドには、getClipRect() がありますが、このメソッドは将来、矩形以外のクリップが提供されるときには、拡張することができません。加えて、現在のクリップ領域を問い合わせした場合でも、さらに限定されたクリップをインストールしたあとで、このクリップを明示的にこの値に設定する方法はありませんでした。
java.awt.Shapeが AWT に追加され、次の 3 つの新しいメソッド
getClip() setClip(Shape) setClip(int x, int y, int w, int h)が AWT Graphics クラスに追加されています。
また、getClipRect() メソッドは、前述したより一般的な getClip() メソッドと次の新しいメソッドがあるので、現在は推奨されていません。
getClipBounds()このメソッドは、現在のクリップ領域のバウンディングボックスを、その形にかかわらず Rectangle として返します。また、このメソッドには、AWT のクラスに渡って行われた用語の更新と整合性のある名前が付けられています。
一時的なクリッピングを実行するために古い API の使用方法を示すサンプルコードを、次に示します。
import Java.awt.*;
import java.applet.*;
public class MyApplet extends Applet {
Image bgimg, img2;
public void paint (Graphics g) {
// Draw a background image
g.drawImage(bgimg, 0, 0, this);
// Draw the upper left 100x100 portion of another image at 10,10
Graphics g2 = g.create();
g2.clipRect(10, 10, 100, 100);
g2.drawImage(offImg, 10, 10, this);
g2.dispose(); // reclaims resources more quickly
// Now continue drawing with original clip area
g.fillRect(0, 0, 10, 10);
}
}
一時的なクリッピングを実行するために新しい API の使用方法を示すサンプルコードを、次に示します。
import Java.awt.*;
import java.applet.*;
public class MyApplet extends Applet {
Image bgimg, img2;
public void paint (Graphics g) {
// Draw a background image
g.drawImage(bgimg, 0, 0, this);
// Draw the upper left 100x100 portion of another image at 10,10
Shape oldclip = g.getClip();
g.clipRect(10, 10, 100, 100);
g.drawImage(img2, 10, 10, this);
g.setClip(oldclip);
// Now continue drawing with original clip area
g.fillRect(0, 0, 10, 10);
}
}