我正在尝试编写一个简单的Java Applet / Application,它将根据它的大小自行调整大小。我基本上工作了,除非我在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)方法的接口。
我正在寻找一种方法来查找可见部分的宽度和高度,以及 offset我需要找到可见部分左上角的点。
答案 0 :(得分:2)
您必须添加自定义JPanel并覆盖getPreferredSize,因为JFrame会考虑装饰(标题栏等)。
private class MyPan extends JPanel {
public Dimension getPreferredSize() { return new Dimension(600, 600); }
public void paintComponent(Graphics g) { /* do stuff */ }
}
然后只需将面板添加到框架和pack();框架。