如何使用AffineTransform缩放Swing组件?

时间:2013-01-26 11:32:46

标签: java swing zoom affinetransform

我正在尝试创建一个面板,我可以放大自定义的JComponent对象。 我试图使用不同的值调用scale()类中的AffineTransform方法,但我没有成功。我的物体消失了。

下面是我在主框架类中使用的组件。一切都有效,除了缩放。你们有些人可以解释一下AffineTransform的概念吗?我不认为JavaDoc explenation对我来说已经足够了。

这是一个可执行的SSCCE:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.HeadlessException;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.geom.AffineTransform;
import javax.swing.JComponent;
import javax.swing.JFrame;


public class JavaApplication1 extends JFrame {

    public static void main(String[] args) {
        new JavaApplication1();
    }

    private MyComponent myComponent = new MyComponent();

    public JavaApplication1() throws HeadlessException {
        this.setSize(400,400);
        this.setVisible(true);
        this.add(myComponent);
    }
    class MyComponent extends JComponent {

        private int x, y;
        private double scale=1;
        private MouseAdapter mouseAdapter = new MouseAdapter();
        private AffineTransform transform = new AffineTransform();

        public MyComponent() {
            this.addMouseListener(mouseAdapter);
            this.addMouseWheelListener(mouseAdapter);
            this.addMouseMotionListener(mouseAdapter);
        }

        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D)g;
            g2.setColor(Color.DARK_GRAY);
            g2.fillRect(0, 0, 400, 400);
            g2.setColor(Color.RED);
            g2.setTransform(transform);

            transform.scale(scale, scale); 
            g2.drawString("My String!", x, y);
        }

        private class MouseAdapter implements MouseWheelListener, MouseListener, MouseMotionListener {

            @Override
            public void mouseWheelMoved(MouseWheelEvent e) {
                if(e.getWheelRotation() == 1) {
                    scale+=0.1;
                }else {
                    scale-=0.1;
                }
            }

            @Override
            public void mouseClicked(MouseEvent e) {
            }

            @Override
            public void mousePressed(MouseEvent e) {            
            }

            @Override
            public void mouseReleased(MouseEvent e) {
            }

            @Override
            public void mouseEntered(MouseEvent e) {
            }

            @Override
            public void mouseExited(MouseEvent e) {
            }

            @Override
            public void mouseDragged(MouseEvent e) {
                x = e.getX();
                y = e.getY();
                repaint();
            }

            @Override
            public void mouseMoved(MouseEvent e) {
            }        
        }
    }   
}

1 个答案:

答案 0 :(得分:3)

transform.scale接受两个双参数,一个用于x轴,另一个用于y轴,1表示中性值(无刻度变化),两个参数表示乘数。

Ex:transform.scale(2,2)将显示组件两倍大,而transform.scale(0.5,0.5)将显示两倍小。

http://docs.oracle.com/javase/6/docs/api/java/awt/geom/AffineTransform.html#scale(double, double)