【问题标题】:How do I zoom on Swing components using AffineTransform?如何使用 AffineTransform 放大 Swing 组件?
【发布时间】:2013-01-10 06:49:33
【问题描述】:

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

下面是我在主框架类中使用的组件。除缩放外,一切正常。你们中的一些人能否解释一下 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) {
            }        
        }
    }   
}

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 看看JLayerJXLayer 有能力使用 PBJar 的扩展库来做到这一点,将这些相同的技术应用于JLayer 应该不是不可能的)。您还应该致电super.paintComponent。您还有许多其他考虑因素,包括缩放组件的大小(或首选大小)
  • @AndrewThompson:好的,我现在用 SSCCE 更新了我的帖子。
  • 请注意,new AffineTransform() 为您提供 identity transformation

标签: java swing zooming affinetransform


【解决方案1】:

transform.scale 接受两个双精度参数,一个用于 x 轴,另一个用于 y 轴,其中 1 为中性值(比例不变),两个参数为乘数。

例如: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)

【讨论】:

  • 我尝试将其硬编码为scale(1.1, 1.1),但每次重绘时该对象都会在一段时间后消失。
  • 参数充当乘数,因此如果每次重绘时调用 scale (1.1, 1.1),组件每次都会增长的预期行为。
  • @Gothmog:那么我希望如果我用负数调用 scale() 对象的大小会减小?我试过了,但没用(看看我上面的代码,我改变了 mouseWheelMoved 方法)。
  • @Rox,不是负数,而是 0 到 1 之间的数字(例如:0.5)
  • @Gothmog:物体也移动到另一个位置。打电话给scale()时,我必须记住AffineTransform.translate吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 2013-03-07
  • 2011-10-25
  • 1970-01-01
相关资源
最近更新 更多