Масштабирование фигур зависит от положения мыши, работает нормально, но я хочу сохранить размер шрифта, поэтому drawString - текст не должен увеличиваться или уменьшаться. Он должен оставаться с одинаковым размером и не приближаться к форме.Как 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
}
В. проблема заключается в том, что если я нарисую текст перед изменением преобразования, текст останется в том же положении, но я хочу сохранить размер текста, а также изменить положение в поле. Так, например, если я увеличиваю масштаб окна , текст не должен быть увеличен, но должен оставаться в верхней части окна. Позиция должна быть адаптирована к масштабу, но размер текста не должен изменяться. – 427
Ну, тогда есть несколько решений: 1) изменить размер шрифта, чтобы он компенсировал масштабирование. 2) компенсировать путем масштабирования шрифта с помощью Font.deriveFont (AffineTransform trans). 3) сначала применить преобразование трансляции к графике, которое перемещает шрифт в нужное место (для этого требуется некоторое математическое мышление), нарисуйте текст, затем замените перевод на ваш масштабирующий перевод и нарисуйте остальные. – lbalazscs
Я попытался изменить размер шрифта, но я не смог получить из него хороший результат :(Я добавил синтаксис, который я использовал для изменения размера. – 427