目前,我的paintComponent是这样的:
@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。
使用睡眠方法,缩放的图像会显示出来,但只会在循环结束后出现。在循环之前和循环期间,它仍然显示原始的完整图像。它的运行就像循环的整个点(动画)是没有意义的,因为只有当它退出时才会发生更改。
任何帮助都是非常感谢的。
另外,如果你们中有人想知道我是如何搞砸计时器的,这就是我的代码(它删除了原始图像,没有显示任何东西,但是计时器确实终止了)
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();
}
}这是我的类属性的片段:
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类。
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();
}
} 再次感谢你的帮助。希望这一页对其他人也有帮助。
发布于 2015-09-25 14:57:49
从JPanel创建绘图面板时,paintComponent方法将绘制或绘制。句号。paintComponent方法什么也不做。没有Thread.sleep。没有计算。就画吧。
因为您刚刚提供了一个paintComponent方法,所以我只是提供DrawingPanel类。
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值。
https://stackoverflow.com/questions/32784514
复制相似问题