gpt4 book ai didi

java - 不使用 JLabel 调整图像大小

转载 作者:行者123 更新时间:2023-11-30 10:44:22 26 4
gpt4 key购买 nike

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

有这样的选择吗?我可以在不使用 JLabels 和 Layouts 的情况下做到这一点吗?如果没有,如何以其他方式做到这一点?

我在 JPanel 上绘制东西的代码

 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的构造函数:

  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 构造函数:

 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);
}

最佳答案

你可以缩放整个东西:

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 对象不属于您——它可能用于绘制其他组件,因此您需要将其保持在提供给您时的状态。
  • WIDTH和HEIGHT需要转为double,因为在Java中,除法运算的任意一个操作数如果是double,结果就是double,如果都是int,则进行整数除法,这肯定不是什么你要。 (例如,3/(double) 2 是 1.5,但 3/2 恰好是 1。)

关于java - 不使用 JLabel 调整图像大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37420738/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com