[英]Java Swing: Picture size doesn't update on resize
我不明白为什么在JFrame调整大小后无法调整在背景上绘制的图片的大小。
基本上,我在此框架内创建一个JFrame和一个JPanel。
然后,使用创建另一个类的对象的“ setBackground”方法设置背景图片(动画gif)。 在这个名为“ ImagePanel”的新类中,我绘制图片并在背景图片上绘制另一个较小的图片。 除非我调整JFrame的大小,否则结果还可以。
背景图片“跟随”调整大小,而较小的图片保留在起点。 我用paintComponent()绘制了两张图片,并在JFrame的Width和Height的基础上设置了图片的尺寸,但这似乎不起作用。
我也添加了一个动作侦听器,以侦听JFrame上的调整大小。 当它侦听调整大小时,它将调用“ repaint()”,但是它不起作用(我还在JFrame和JPanel上都尝试了“ revalidate()”,但均未成功)。
似乎当您放大JFrame几乎覆盖所有屏幕时,它具有更新,在固定点上,较小的图片被“更新”,但是以错误的方式进行,并且仅当JFrame非常大时。
这是代码。 “ GameWindow”类:
import java.awt.BorderLayout;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class GameWindow extends JFrame {
private JPanel mapPicture = new JPanel();
public GameWindow(){
super("WELCOME!!!");
setSize(768, 768);
addComponentListener(new ResizeListener(this));
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
setBackground();
setVisible(true);
}
private void setBackground() {
mapPicture = new ImagePanel("map.gif", this);
add(mapPicture, BorderLayout.CENTER);
mapPicture.setLayout(new BorderLayout());
}
public class ResizeListener implements ComponentListener {
private JFrame parentFrame;
public ResizeListener(JFrame parentFrame) {
this.parentFrame = parentFrame;
}
public void componentHidden(ComponentEvent e) {}
public void componentMoved(ComponentEvent e) {}
public void componentShown(ComponentEvent e) {}
public void componentResized(ComponentEvent e) {
repaint();
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new GameWindow2();
}
});
}
}
这是“ ImagePanel”类:
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ImagePanel extends JPanel {
private ImageIcon background;
private JFrame parentFrame;
private ImageIcon smallerImage = new ImageIcon(getClass().getResource("car.png"));
public ImagePanel(String imgPath, JFrame parentFrame) {
this.parentFrame = parentFrame;
background = new ImageIcon(getClass().getResource(imgPath));
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.drawImage(background.getImage(), 0, 0, getWidth(), getHeight(), this);
g2d.drawImage(smallerImage.getImage(), 119*((parentFrame.getWidth()/768)), 172*((parentFrame.getHeight())/768), 32*((parentFrame.getWidth())/768), 32*((parentFrame.getHeight())/768),this);
}
}
我不明白为什么较小的图片没有用新的比例重绘。
PS:我不能使用布局管理器来设置第二张图片的位置,因为(将来)我将有很多对象随意地放置在地图上(并可能对其进行动画处理)。
这是因为您使用整数算术并在相乘之前相除: 119*(parentFrame.getWidth()/768)
相反,您使用浮点算术并将其(int)(119.0*(parentFrame.getWidth()/768.0))
转换为int: (int)(119.0*(parentFrame.getWidth()/768.0))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.