大きさに応じてサイズが変更される単純なJavaアプレット/アプリケーションを作成しようとしています。JFrame grpahics(jframe.getGraphics())に何かをペイントする場合を除いて、基本的には機能しています。ポイント0,0では、ウィンドウの境界の外側の左上隅から開始しているように見えます。ウィンドウのトップバーの下に最初の30ピクセルほどあります。また、jframe.getWidth()とjframe.getHeight()は、ウィンドウ内の表示部分ではなく、ウィンドウの幅と高さを返します。
これは、私の問題を示すために使用しているコードの抜粋です。
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
public class ImageHandler {
private boolean debug;
private int rememberWidth, rememberHeight, contractedImageX,
contractedImageY, imageTranslationX, imageTranslationY, realWidth,
realHeight, fixedWidth, fixedHeight;
private BufferedImage bImage1, bImage2;
private Graphics2D bufferedGraphics1, bufferedGraphics2;
private boolean resizeNext, isApplet;
public ImageHandler(ObjectHandler objH) {
debug = objH.isDebug();
objH.setImageHandler(this);
objectHandler = objH;
isApplet = objectHandler.isApplet();
fixedWidth = objectHandler.getScreenWidth();
fixedHeight = objectHandler.getScreenHeight();
}
public void paint(Paintable p) {
/*
* If the screen is not the same size at remembered, then re-run the
* image transformations
*/
realWidth = getRealWidth();
realHeight = getRealHeight();
if (objectHandler.isFocused() == true
|| objectHandler.isApplet() == true) {
if (!(rememberWidth == realWidth && rememberHeight == realHeight)
|| resizeNext) {
resizeNext = false;
if (debug)
System.out.println("Re-sizing");
/* Create New Images */
bImage1 = new BufferedImage(realWidth, realHeight,
BufferedImage.TYPE_INT_ARGB);
bImage2 = new BufferedImage(fixedWidth, fixedHeight,
BufferedImage.TYPE_INT_ARGB);
bufferedGraphics1 = (Graphics2D) bImage1.getGraphics();
bufferedGraphics1.setColor(Color.black);
bufferedGraphics1.fillRect(0, 0, realWidth, realHeight);
bufferedGraphics2 = (Graphics2D) bImage2.getGraphics();
/*
* Remember The current Height and width, so that it can check
* if the height has changed before running this again
*/
rememberWidth = realWidth;
rememberHeight = realHeight;
/*
* Define contractedImageX and y depending on the height of the
* screen
*/
contractedImageY = realHeight;
contractedImageX = (int) ((double) contractedImageY
/ (double) fixedHeight * fixedWidth);
/*
* If the graphics defined by using the height make it go off
* the sides of the screen, redefine with the width
*/
if (debug) {
System.out.println("1Real Height:" + realHeight + " Width:"
+ realWidth + " contractedHeight:"
+ contractedImageY + " contractedWidth:"
+ contractedImageX);
}
if (contractedImageX > realWidth) {
contractedImageX = realWidth;
contractedImageY = (int) ((double) contractedImageX
/ (double) fixedWidth * fixedHeight);
}
if (debug) {
System.out.println("2Real Height:" + realHeight + " Width:"
+ realWidth + " contractedHeight:"
+ contractedImageY + " contractedWidth:"
+ contractedImageX);
}
/*
* Re Calculate Image Translations so that they position the
* image correctly
*/
imageTranslationX = (realWidth - contractedImageX) / 2;
imageTranslationY = (realHeight - contractedImageY) / 2;
if (debug) {
System.out.println("X: " + imageTranslationX + " Y: "
+ imageTranslationY);
}
}
// clears the screen
bufferedGraphics2.setColor(Color.black);
bufferedGraphics2.fillRect(0, 0, fixedWidth, fixedHeight);
p.paint(bufferedGraphics2);
bufferedGraphics1.setColor(Color.black);
bufferedGraphics1.fillRect(0, 0, realWidth, realHeight);
bufferedGraphics1.drawImage(bImage2, imageTranslationX,
imageTranslationY, contractedImageX + imageTranslationX,
contractedImageY + imageTranslationY, 0, 0, fixedWidth,
fixedHeight, null);
drawFinalImage(bImage1);
}
}
private void drawFinalImage(Image img) {
if (isApplet) {
if (objectHandler.getjApplet() != null) {
objectHandler.getjApplet().getGraphics()
.drawImage(img, 0, 0, null);
}
} else {
if (objectHandler.getjFrame() != null) {
objectHandler.getjFrame().getGraphics()
.drawImage(img, 0, 0, null);
}
}
}
private int getRealWidth() {
if (objectHandler.isApplet()) {
if (objectHandler.getjApplet() != null) {
Integer w = objectHandler.getjApplet().getWidth();
if (w != null && w > 0) {
return w;
}
}
} else {
if (objectHandler.getjFrame() != null) {
Integer w = objectHandler.getjFrame().getWidth();
if (w != null && w > 0) {
return w;
}
}
}
return fixedWidth;
}
private int getRealHeight() {
if (objectHandler.isApplet()) {
if (objectHandler.getjApplet() != null) {
Integer h = objectHandler.getjApplet().getHeight();
if (h != null && h > 0) {
return h;
}
}
} else {
if (objectHandler.getjFrame() != null) {
Integer h = objectHandler.getjFrame().getHeight();
if (h != null && h > 0) {
return h;
}
}
}
return fixedHeight;
}
}
そのコードは私のプログラム全体ではなく、ウィンドウのサイズを変更してグラフィックをペイントする部分だけです。Paintableは、私が作成したメソッドpaint(Graphcis g)を持つインターフェイスです。
表示されているセクションの幅と高さ、および表示されているセクションの左上隅にあるポイントを見つけるために必要なオフセットを見つける方法を探しています。