在java中使用滚轮缩放

时间:2017-03-05 11:27:38

标签: java mouseevent zoom mandelbrot

我正在尝试制作一个允许缩放的Mandelbrot程序,但缩放似乎不起作用,我不知道我实现缩放的方式有什么问题。我是使用eclipse并且程序不会返回任何错误。这是我的代码:

import java.awt.Graphics; 
import java.awt.event.*; 
import java.awt.image.BufferedImage; 
import javax.swing.JFrame;   

public class Mandelbrot extends JFrame {

            private final int MAX_ITER = 570;
            private static double ZOOM = 200;
            private BufferedImage I;
            private double zx, zy, cX, cY, tmp;
            public static boolean zooming = false;
            public Mandelbrot() 
            {
                 super("MandelbrotSet");
                 setBounds(100, 100, 800, 600);
                 setResizable(false);
                 setDefaultCloseOperation(EXIT_ON_CLOSE);
                 I = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
                 for (int y = 0; y < getHeight(); y++) {
                     for (int x = 0; x < getWidth(); x++) {
                         zx = zy = 0;
                         cX = (x - 400) / ZOOM;
                         cY = (y - 300) / ZOOM;
                         int iter = MAX_ITER;
                         while (zx * zx + zy * zy < 4 && iter > 0) {
                             tmp = zx * zx - zy * zy + cX;
                             zy = 2.0 * zx * zy + cY;
                             zx = tmp;
                             iter--;
                         }
                         I.setRGB(x, y, iter | (iter << 8));
                     }
                }
             setVisible(true);
             while(1>0)
             {
                 if(zooming)
                 {
                     revalidate();
                     repaint();
                     System.out.println("zooming");
                     zooming = false;
                 }
             }    }

            @Override
            public void paint(Graphics g) {
                g.drawImage(I, 0, 0, this);
            }

            public static void main(String[] args) {
                new Mandelbrot().addMouseWheelListener(new MouseWheelListener(){   public void mouseWheelMoved(MouseWheelEvent
        e) {

                if (e.getWheelRotation() < 0) {
                   ZOOM=ZOOM+100;
                   zooming = true;
                } else 
                {
                    ZOOM=ZOOM-100;
                    zooming = true;

                } }    });

            } }

1 个答案:

答案 0 :(得分:1)

  1. 您的构造函数包含无限循环。因此,它永远不会返回,并且您的MouseWheelListener永远不会添加到框架中。

  2. 你只计算BufferedImage一次(在无限循环之前),所以即使你在循环之前附加MouseWheelListener它也没有效果。

  3. 我会将图片的计算移动到自己的方法中,从构造函数调用此方法一次,从MouseWheelListener调用一次,并从构造函数中删除无限循环。

            public Mandelbrot() 
            {
                 super("MandelbrotSet");
                 //...
                 I = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
                 calculatePicture();
                 setVisible(true);
            }
            public void calculatePicture() {
                 for (int y = 0; y < getHeight(); y++) {
                     //...
                 }
                 repaint();
            }
            public static void main(String[] args) {
                new Mandelbrot().addMouseWheelListener(new MouseWheelListener(){
                    public void mouseWheelMoved(MouseWheelEvent
        e) {
                        //...
                        calculatePicture();
                    }
                });
            }