首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPanel映像仅在paintComponent循环结束后更新

JPanel映像仅在paintComponent循环结束后更新
EN

Stack Overflow用户
提问于 2015-09-25 14:31:05
回答 1查看 85关注 0票数 0

目前,我的paintComponent是这样的:

代码语言:javascript
复制
    @Override
    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    System.out.println(choice);
    if(choice == 1)
    {   
        g.drawImage(img, 0, 0, getWidth(), getHeight(), this);

        System.out.println("\nImgWidth: " + img.getWidth()
                + "\nFrameWidth: " + getWidth()
                + "\nImgHeight: " + img.getHeight()
                + "\nFrameHeight: " + getHeight()
        );
    }
    else if (choice == 2)
    {
        scale = 3.0;
        while(currScale < scale){
            currScale += .1;
            System.out.println(currScale + "-" + scale);

            Graphics2D g2 = (Graphics2D)g;
            g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                            RenderingHints.VALUE_INTERPOLATION_BICUBIC);
            int w = getWidth(); 
            int h = getHeight(); 
            int imageWidth = img.getWidth(); 
            int imageHeight = img.getHeight(); 
            double x = (w - currScale * imageWidth)/2;
            double y = (h - currScale * imageHeight)/2; 
            AffineTransform at = AffineTransform.getTranslateInstance(x,y);
            at.scale(currScale, currScale);
            g2.drawRenderedImage(img, at); 
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {}

        }
    }

}

当我忘记循环,只使用一个固定的值进行缩放时,代码就能工作了,但是我希望它是动画的,而不是立即缩放。我尝试使用计时器替代,但什么都没有显示,图像只是消失的时刻,paintComponent被触发,选择是2。

使用睡眠方法,缩放的图像会显示出来,但只会在循环结束后出现。在循环之前和循环期间,它仍然显示原始的完整图像。它的运行就像循环的整个点(动画)是没有意义的,因为只有当它退出时才会发生更改。

任何帮助都是非常感谢的。

另外,如果你们中有人想知道我是如何搞砸计时器的,这就是我的代码(它删除了原始图像,没有显示任何东西,但是计时器确实终止了)

代码语言:javascript
复制
   else
    {
        scale = 3.0;
            timer = new Timer(500, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {

        if(currScale < scale){
            System.out.println(currScale + "-" + scale);
            currScale += .1;
            Graphics2D g2 = (Graphics2D)g;
            g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                            RenderingHints.VALUE_INTERPOLATION_BICUBIC);
        int w = getWidth();
        int h = getHeight();
        int imageWidth = img.getWidth();
        int imageHeight = img.getHeight();
        double x = (w - currScale * imageWidth)/2;
        double y = (h - currScale * imageHeight)/2;
        AffineTransform at = AffineTransform.getTranslateInstance(x,y);
        at.scale(currScale, currScale);
        g2.drawRenderedImage(img, at);
        }
                }


            });

         if(currScale > scale)
        {
             timer.stop();
        }
         else
         {
             timer.setRepeats(true);
             timer.setCoalesce(true);
             timer.start();  
         }
    }

这是我的类属性的片段:

代码语言:javascript
复制
 class loadImage extends JPanel {
 private int choice;
 double scale;
 double currScale = 1.0;
 BufferedImage img;
 //Timer timer; (if using the timer)

修复:添加一些上下文,我使用的是Netbean的GUI-Builder。每次我需要使用loadImage的方法时,我都选择手动将面板键入到loadImage类。

代码语言:javascript
复制
    public void ZoomIn() {
    double scale = 3.0;
    double scaleAddOn = 0.1;
    Timer timer;
    timer = new Timer(40, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) 
        {
            double currScale;
            currScale = ((loadImage)imageArea).getCurrScale();
            if(currScale < scale)
            {
                ((loadImage)imageArea).setCurrScale(currScale + scaleAddOn);
            }
        }
    });

    if(((loadImage)imageArea).getCurrScale() > scale)
    {
         timer.stop();
    }
     else
     {
         timer.setRepeats(true);
         timer.setCoalesce(true);
         timer.start();  
     }
}    

再次感谢你的帮助。希望这一页对其他人也有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-25 14:57:49

从JPanel创建绘图面板时,paintComponent方法将绘制或绘制。句号。paintComponent方法什么也不做。没有Thread.sleep。没有计算。就画吧。

因为您刚刚提供了一个paintComponent方法,所以我只是提供DrawingPanel类。

代码语言:javascript
复制
package com.ggl.testing;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

public class DrawingPanel extends JPanel {

    private static final long serialVersionUID = 506794466435048661L;

    private double currScale;

    private int choice;

    private BufferedImage img;

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        System.out.println(choice);
        if (choice == 1) {
            g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
            System.out.println("\nImgWidth: " + img.getWidth()
                    + "\nFrameWidth: " + getWidth() + "\nImgHeight: "
                    + img.getHeight() + "\nFrameHeight: " + getHeight());
        } else if (choice == 2) {
            Graphics2D g2 = (Graphics2D) g;
            g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                    RenderingHints.VALUE_INTERPOLATION_BICUBIC);
            int w = getWidth();
            int h = getHeight();
            int imageWidth = img.getWidth();
            int imageHeight = img.getHeight();
            double x = (w - currScale * imageWidth) / 2;
            double y = (h - currScale * imageHeight) / 2;
            AffineTransform at = AffineTransform.getTranslateInstance(x, y);
            System.out.println("Pass");
            at.scale(currScale, currScale);
            System.out.println("Pass");
            g2.drawRenderedImage(img, at);
            System.out.println("Pass");
        }
    }

    public double getCurrScale() {
        return currScale;
    }

    public void setCurrScale(double currScale) {
        this.currScale = currScale;
        repaint();
    }

    public int getChoice() {
        return choice;
    }

    public void setChoice(int choice) {
        this.choice = choice;
    }

    public BufferedImage getImg() {
        return img;
    }

    public void setImg(BufferedImage img) {
        this.img = img;
    }

}

您可以使用可运行的类或Swing计时器来更新currScale值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32784514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档