Java Swing:图片大小在调整大小时不会更新

时间:2014-06-09 17:09:23

标签: java swing resize paintcomponent repaint

我不明白为什么在我的背景上绘制的图片在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:我不能使用布局管理器来设置第二张图片的位置,因为我会有很多对象(将来)在地图上以一种随意的方式放置(并且可能是动画它们)。

1 个答案:

答案 0 :(得分:1)

这是因为你在乘法前使用整数运算和除法:119*(parentFrame.getWidth()/768)

而是浮点运算并转换为int:(int)(119.0*(parentFrame.getWidth()/768.0))