关于JPanel Image,Zoom&翻译

时间:2015-09-29 16:58:43

标签: java image swing zoom paintcomponent

这是我目前的代码:

class loadImage extends JPanel {
private int choice;
double scale;
double currScale = 1.0;
BufferedImage img;
Timer timer;

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    System.out.println(choice);

     g.drawImage(img, 0, 0, getWidth(), getHeight(), null);

    if (choice == 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);
    }
    else if (choice == 2)
    {

        Graphics2D g2 = (Graphics2D)g;
        int x = 5;
        int y = getHeight() - img.getHeight();
        AffineTransform at = AffineTransform.getTranslateInstance(x, y);
        at.setToTranslation(x, y);
        g2.drawRenderedImage(img, at);
    }
}                            

public loadImage() {
    choice = 0;
    try {
        img = ImageIO.read(new File("pic.png"));
    } catch (IOException ex) {
    }

}

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


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

public double getCurrScale() {
    return currScale;
}    
}


public class NewJFrame extends javax.swing.JFrame {

/**
 * Creates new form NewJFrame
 */
public NewJFrame() {
    initComponents();
    setLocationRelativeTo(null);

}

public void ZoomIn(double scale) {
    if(scale > ((loadImage)imageArea).getCurrScale())
    {
        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();  
         }
    }
    else JOptionPane.showMessageDialog(rootPane, "Fail Zoom In\nScale: " + scale + "\nCurrScale: " + ((loadImage)imageArea).getCurrScale());
}
public void ZoomOut(double scale) {
    if(scale < ((loadImage)imageArea).getCurrScale())
    {
    double scaleDecrement = 0.1;
    Timer timer;
    timer = new Timer(1000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) 
        {
            double currScale;
            currScale = ((loadImage)imageArea).getCurrScale();
            if(scale < currScale)
            {
                ((loadImage)imageArea).setCurrScale(currScale - scaleDecrement);
            }
        }
    });

    if(scale > ((loadImage)imageArea).getCurrScale())
    {
         timer.stop();
    }
     else
     {
         timer.setRepeats(true);
         timer.setCoalesce(true);
         timer.start();  
     }
    }         
    else JOptionPane.showMessageDialog(rootPane, "Fail Zoom Out\nScale: " + scale + "\nCurrScale: " + ((loadImage)imageArea).getCurrScale());
}      


private void resetImageActionPerformed(java.awt.event.ActionEvent evt) {                                         
    ((loadImage)imageArea).setChoice(0);
    this.repaint();
}                                        

private void zoomInActionPerformed(java.awt.event.ActionEvent evt) {                                         
    ((loadImage)imageArea).setChoice(1);
    this.repaint();
    ZoomIn(3.0);
}                                        

private void printScaleActionPerformed(java.awt.event.ActionEvent evt) {                                         
    System.out.println(((loadImage)imageArea).getCurrScale());
}                                        

private void zoomOutActionPerformed(java.awt.event.ActionEvent evt) {                                         
    ((loadImage)imageArea).setImage(1);
    this.repaint();
    ZoomOut(1.0);
}                                        

目标是显示图像,然后添加放大,缩小和移动它。

有关图像的详细信息=其尺寸为1280 x 1024 GUI jpanel的尺寸为563 x 377。 程序运行时,图像完全适合JPanel 563乘377.

放大完成它的工作,但当我执行它并减慢计时器时,我注意到它似乎没有开始遵循JPanel的尺寸,而是原始尺寸。当放大代码运行时,它将恢复为原始尺寸(现在在jpanel中裁剪),然后进行缩放。

缩小代码的作用与图像尺寸更改相同。它实际上并没有缩小。我最终在屏幕上看到的是图像按比例放大,然后向后缩小与放大的数量相同。它只是在那个不变的循环中。我按下printScale按钮,它返回完全相同的数字,即使不管该循环的哪一部分正在显示。

翻译(如果选择== 2)也是同样的交易。它不遵循JPanel的图像大小,而是遵循实际图像大小。

为什么即使g.drawImage(img,0,0,getWidth(),getHeight(),null),选择中的图像也不会跟随图像的大小;被称为? 为什么我的缩小方法的行为方式是这样的? 抱歉阅读不愉快。任何帮助表示赞赏。

MY FIX: 我最终放弃了他们的线程同行的计时器,并没有更多的放大和缩小的问题。我还在试图找出g.drawImage的东西以及如何使它们保持一致。当我弄明白时,我会再次更新。

0 个答案:

没有答案