java - Swing ,调整大小然后绘制

标签 java image swing

我有一个要在 JFrame 上绘制的图像。图像的尺寸取决于 JFrame 的尺寸。

JFrame 的绘制频率明显高于 JFrame 实际调整大小的频率。因此,我调整了图像大小,然后将其存储在组件调整大小事件中,并且只在 draw 方法中绘制了调整大小后的图像。

//called on componentResized
private void scaleImage(){
    if((this.getHeight() * this.getWidth()) != 0)
        scalledBackGroundImage = backGroundImage.getScaledInstance(this.getWidth(), this.getHeight(), Image.SCALE_FAST);
    else
    scalledBackGroundImage = null;
}

@Override
public void paint(Graphics g){
    if(scalledBackGroundImage != null)
        g.drawImage(scalledBackGroundImage, 0, 0, this);

    super.paint(g);
}

然而,我认为重新绘制组件时,重新调整大小事件是在绘制之后调用的。因此显示的图像是先前帧尺寸的图像。这确实成为最大化或最小化等操作的问题。

我正在寻找一种在调用绘制之前检测 JFrame 大小调整的方法。 (我知道我可以在调整大小时调用 repaint() 但要求在调整大小时绘制两次组件似乎有点粗鲁)

感谢您的帮助。

最佳答案

参见 The Perils of Image.getScaledInstance() .这真的不是一个很好的选择。

不仅你有你上面描述的问题,而且我还经常闪烁:

import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.plaf.*;
import javax.swing.text.*;
import java.io.*;

public class ResizeSSCCE extends JPanel
{
    Image original;
    Image scaled;

    public ResizeSSCCE()
    {
        original = new ImageIcon( "mong.jpg" ).getImage();
        scaled = original;
        scaleImage();

        ComponentListener cl = new ComponentAdapter()
        {
            @Override
            public void componentResized(ComponentEvent e)
            {
                scaleImage();
            }
        };

        addComponentListener(cl);
    }

    @Override
    public void paintComponent(Graphics g)
    {
        if (scaled != null)
            g.drawImage(scaled, 0, 0, this);
//          g.drawImage(original, 0, 0, getWidth(), getHeight(), this);
    }

    private void scaleImage()
    {
        if (getHeight() * getWidth() != 0)
            scaled = original.getScaledInstance(getWidth(), getHeight(), Image.SCALE_FAST);
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("ResizeSSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new ResizeSSCCE() );
        frame.setSize(200, 200);
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

更改代码以使用您的图像,然后使用缩放版本运行以查看闪烁。然后更改代码以使用作为苍蝇比例的原始图像来查看差异。正如文章所建议的那样,动态缩放是更好的方法。

关于java - Swing ,调整大小然后绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17310107/

相关文章:

java - 当通过 Google Play 更新 Android 应用程序时, Activity 开始出现奇怪的异常

java - 如何在 android 中创建视频 url 的缩略图?

java - 在使用 BoxLayout 面板构建 Java GUI 时,如何将两个 swing 组件添加到同一行?

java - java中双链表删除节点

java - 当多个实例访问时,线程池线程安全吗?

java - 作业中索引越界异常

image - 在 Qt 中如何给图像添加注释?

php - 如何从 CodeIgniter 中的目录文件夹中删除上传的图像

java - 如何在 JFreeChart 中实现居中的 FlowArrangement?

java - swing flowlayout preferredSize 不会自动改变