首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用JLabel调整图像大小

不使用JLabel调整图像大小
EN

Stack Overflow用户
提问于 2016-05-24 18:00:48
回答 2查看 66关注 0票数 2

我正在写一个类似于河川Raid的游戏,所有的图像都是用g.drawImage(.)绘制的.我的问题是:当有人要调整JFrame的大小时,如何保持内容的纵横比,并缩放内容以适应新的窗口大小?

有没有这样的选择?我可以在不使用JLabels和布局的情况下这样做吗?如果没有,那怎么做呢?

我在JPanel上画东西的代码

代码语言:javascript
复制
 private void doDrawing(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        drawStrings(g2);
        mapa.drawMap(g2);
        ArrayList ms = craft.getMissiles();

        for (Object m1 : ms) {
            Missile m = (Missile) m1;
            g2.drawImage(m.getImage(), m.getX(), m.getY(), this);
        }
        g2.drawImage(craft.getImage(), craft.getX(), craft.getY(), this);
        for (EnemyJet enemy : enemies) {
            g2.drawImage(enemy.getImage(), enemy.getX(), enemy.getY(), this);
        }
        for (Fuel fuel : fuels) {
            g2.drawImage(fuel.getImage(), fuel.getX(), fuel.getY(), fuel.getHeight(), fuel.getHeight(), this);
        }
        for (Obstacle o : obst) {
            g2.drawImage(o.getImage(), o.getX(), o.getY(), this);
        }
        drawStrings(g2);
    }

也是Jpanel构造函数:

代码语言:javascript
复制
  private void initBoard() {
        addKeyListener(new TAdapter());
        setFocusable(true);
        setBackground(Color.WHITE);
        setLayout(new GridBagLayout());
        craft = new Craft(ICRAFT_X, ICRAFT_Y);
        mapa = new Mapa();
        setMinimumSize(new Dimension(WIDTH, HEIGHT));
        initEnemiesAndAddThem();
        czas = new Timer(delay, this);
        czas.start();
    }

JFrame构造函数:

代码语言:javascript
复制
 private void initGame()
    {
        add(new Plansza());
        setTitle("Reeevah Raaid");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(WIDTH, HEIGHT);
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        setLocationRelativeTo(null);
        pack();
        setVisible(true);
        //setExtendedState(JFrame.MAXIMIZED_BOTH);
        //setResizable(false);
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-24 20:08:34

你可以把整件事都放大:

代码语言:javascript
复制
private void doDrawing(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;

    AffineTransform originalTransform = g2.getTransform();
    g2.scale(getWidth() / (double) WIDTH, getHeight() / (double) HEIGHT);

    // Do all drawing here

    g2.setTransform(originalTransform);
}

一些注意事项:

  • 最后的g2.setTransform(originalTransform)是很重要的。Graphics对象不属于您--它可能用于绘制其他组件,因此您需要将它保持在给予您时的状态。
  • 需要将宽度和高度转换为双倍,因为在Java中,如果除法操作的任何操作数是double,则结果是double,但如果它们都是int,则执行整数除法,这肯定不是您想要的结果。(例如,3 / (double) 2是1.5,但3 / 2正好是1)。
票数 1
EN

Stack Overflow用户

发布于 2016-05-24 18:47:59

任何图像都需要按以下方式绘制:

代码语言:javascript
复制
  double fct=1.0*image.getWidth()/getWidth();
  double fct2=1.0*image.getHeight()/getHeight();
  if(fct2>fct) fct=fct2;
  g2.drawImage(image, x, y, (int)(1.0*image.getWidth()/fct), (int)(1.0*image.getHeight()/fct), this);

这会留下很多空白处--但如果你想保持高宽比的话。

--

若要对图像进行居中,请执行以下操作:

代码语言:javascript
复制
int newWidth=(int)(1.0*image.getWidth()/fct);
int newHeight=(int)(1.0*image.getHeight()/fct);
g2.drawImage(image, getWidth()/2-newWidth()/2, getHeight()/2-newHeight()/2, newWidth, newHeight, this);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37420738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档