如何使用 AffineTransform 放大 Swing 组件? [英] How do I zoom on Swing components using AffineTransform?

查看:32
本文介绍了如何使用 AffineTransform 放大 Swing 组件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to create a panel where I will have the possibility to zoom on custom made JComponent objects. I have tried to call the scale() method in the AffineTransform class with different values, but I have not succeeded. My objects just disappear.

下面是我在主框架类中使用的组件.除了缩放之外,一切正常.你们中的一些人能否解释一下 AffineTransform 的概念.我认为 JavaDoc 的解释对我来说还不够.

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. I don´t think the JavaDoc explenation is enough for me.

这是一个可执行的 SSCCE:

Here is an executable 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 接受两个 double 参数,一个用于 x 轴,另一个用于 y 轴,为 1 中性值(比例不变),和两个参数是乘数.

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(2,2) 会将组件显示为两倍大,而 transform.scale(0.5,0.5) 会将其显示为小两倍.

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.

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

这篇关于如何使用 AffineTransform 放大 Swing 组件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆