缩放形状取决于鼠标位置工作正常,但我想保持字体大小,因此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
}
答案 0 :(得分:0)
这很简单:在更改图形转换之前绘制文本,然后文本大小不受影响。