我不明白为什么在我的背景上绘制的图片在JFrame调整大小时没有调整大小。
基本上我在这个框架内创建一个JFrame和一个JPanel。
然后我用方法" setBackground"设置我的背景图片(动画gif)。这会创建另一个类的对象。在这个名为" ImagePanel"我画了一幅画,并在背景图片上画了另一幅较小的照片。除非我调整JFrame的大小,否则结果还可以。
背景图片"跟随"调整大小,而较小的图片保持在起点。我使用paintComponent()绘制两个图片,并在JFrame的宽度和高度的基础上设置图片的尺寸,但它似乎不起作用。
我也添加了一个动作监听器,以收听JFrame上的调整大小。当它监听调整大小时它调用" repaint()",但它没有工作(我也尝试了#34; revalidate()"在JFrame和JPanel上都没有成功)。
似乎当你放大几乎覆盖所有屏幕的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:我不能使用布局管理器来设置第二张图片的位置,因为我会有很多对象(将来)在地图上以一种随意的方式放置(并且可能是动画它们)。
答案 0 :(得分:1)
这是因为你在乘法前使用整数运算和除法:119*(parentFrame.getWidth()/768)
而是浮点运算并转换为int:(int)(119.0*(parentFrame.getWidth()/768.0))