繁体   English   中英

Java Swing:图片大小不会随着调整大小而更新

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM