简体   繁体   English

如何使用AffineTransform缩放Swing组件?

[英]How do I zoom on Swing components using AffineTransform?

I am trying to create a panel where I will have the possibility to zoom on custom made JComponent objects. 我正在尝试创建一个面板,在其中可以放大自定义的JComponent对象。 I have tried to call the scale() method in the AffineTransform class with different values, but I have not succeeded. 我试图用不同的值调用AffineTransform类中的scale()方法,但没有成功。 My objects just disappear. 我的物体消失了。

Below is my component that is used in the main frame class. 下面是我在主框架类中使用的组件。 Everything works except the zooming. 除缩放外,所有操作均有效。 Could some of you explain the concepts of AffineTransform. 你们中的一些人可以解释AffineTransform的概念吗? I don´t think the JavaDoc explenation is enough for me. 我认为JavaDoc资格对我来说还不够。

Here is an executable SSCCE: 这是一个可执行的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) {
            }        
        }
    }   
}

transform.scale accepts two double parameters, one for the x axis and the other for the y axis, being 1 the neutral value (no change in scale), and the two parameters the multipliers. transform.scale接受两个双精度参数,一个用于x轴,另一个用于y轴,它们是1中性值(比例不变),两个参数是乘数。

Ex: transform.scale(2,2) will show the component twice as big, while transform.scale(0.5,0.5) will show it twice as small. 例如: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) http://docs.oracle.com/javase/6/docs/api/java/awt/geom/AffineTransform.html#scale(double,double)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM