drawString / text如何使用scale时不缩放文本?

时间:2015-07-18 15:00:58

标签: java java-2d affinetransform

缩放形状取决于鼠标位置工作正常,但我想保持字体大小,因此drawString - 文本不应放大或缩小。它应保持相同的尺寸,不要与形状一起放大。

我使用AffineTransform进行了一些测试,但找不到一个非常好的解决方案。

希望有人有个主意。也许我不去看树木:/

ScroolnZoom2D.java

package scroolnzoom2d;

import java.awt.BorderLayout;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.NoninvertibleTransformException;
import java.awt.geom.Point2D;
import javax.swing.JFrame;

public class ScroolnZoom2D extends JFrame implements  MouseWheelListener {

    PaintCanvas painting=new PaintCanvas();

    public ScroolnZoom2D(){
        super();
        this.setTitle("Frame");
        this.setSize(500,500);

        this.getContentPane().add(this.painting,BorderLayout.CENTER);

        painting.addMouseWheelListener(this);

        //Close
        this.addWindowListener(new WindowAdapter(){
            @Override
            public void windowClosing(WindowEvent event){
                System.exit(0);
            }
        });              

        this.setVisible(true);  
    }


    @Override
    public void mouseWheelMoved(MouseWheelEvent me) {
        Point2D prePoint=getPointInBi(me.getX(),me.getY());
        Point2D afterPoint=null;

        //Zoom In/Out on wheel movement
        if (me.getUnitsToScroll() > 0) {
            painting.at.scale(0.80, 0.80);
        } else {
            painting.at.scale(1.20, 1.20);
        }

        afterPoint=getPointInBi(me.getX(),me.getY());
        painting.at.translate(afterPoint.getX()-(prePoint.getX()),(afterPoint.getY()-prePoint.getY()));
        painting.repaint();

    }

    private Point2D getPointInBi(double X,double Y){
        Point2D point2Transfer = new Point2D.Double(X,Y);
        try {
            return painting.at.inverseTransform(point2Transfer, null);
        } catch (NoninvertibleTransformException ex) {
            return null;
        }
    }

    public static void main(String[] args) {
        ScroolnZoom2D gui=new ScroolnZoom2D();
    }
}

PaintCanvas.java

package scroolnzoom2d;

import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class PaintCanvas extends JPanel{

    AffineTransform at = new AffineTransform();

    private BufferedImage bi;
    private Graphics2D g2bi;
    private int w,h;

    Font TextFont;
    int varFontSize=11; //Text Size

    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);       

        Graphics2D g2 = (Graphics2D) g;

        w=this.getSize().width;
        h=this.getSize().height;

        bi=new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB);

        g2bi=bi.createGraphics();

        g2bi.transform(at);  

        //Draw Rectangle
        Rectangle r=new Rectangle(w/2,h/2,200,80);
        g2bi.setColor(Color.RED);
        g2bi.draw(r);

        //Draw Text
        TextFont = new Font("Dialog",1,varFontSize);
        g2bi.setFont(TextFont);
        g2bi.setColor(Color.BLUE);
        g2bi.drawString("Should stay the same text size \"11\"", w/2, h/2);

        //Draw BufferedImage
        g2.drawImage(bi,0,0, this);
    }

}

我正在测试改变文字大小,因为我正在放大或缩小比例。它有效但不是100%:(有人有想法吗?

    //Zoom In/Out on wheel movement
    if (me.getUnitsToScroll() > 0) {
        painting.at.scale(0.80, 0.80);
        //Zoom out
        System.out.println(painting.varFontSize);
        System.out.println(painting.at.getScaleX());
        painting.varFontSize=painting.varFontSize+4;

    } else {
        painting.at.scale(1.20, 1.20);
        painting.varFontSize=painting.varFontSize-3;
        //Zoom in

    }

1 个答案:

答案 0 :(得分:0)

这很简单:在更改图形转换之前绘制文本,然后文本大小不受影响。