Java在窗口边界下绘制图形

时间:2012-12-29 23:13:25

标签: java swing jframe

我正在尝试编写一个简单的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我需要找到可见部分左上角的点。

1 个答案:

答案 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();框架。