2015-07-18 2 views
0

Масштабирование фигур зависит от положения мыши, работает нормально, но я хочу сохранить размер шрифта, поэтому 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 

    } 

ответ

0

Это легко: нарисовать текст перед тем изменения преобразования из графика, а затем размер текста будет неизменным

+0

В. проблема заключается в том, что если я нарисую текст перед изменением преобразования, текст останется в том же положении, но я хочу сохранить размер текста, а также изменить положение в поле. Так, например, если я увеличиваю масштаб окна , текст не должен быть увеличен, но должен оставаться в верхней части окна. Позиция должна быть адаптирована к масштабу, но размер текста не должен изменяться. – 427

+1

Ну, тогда есть несколько решений: 1) изменить размер шрифта, чтобы он компенсировал масштабирование. 2) компенсировать путем масштабирования шрифта с помощью Font.deriveFont (AffineTransform trans). 3) сначала применить преобразование трансляции к графике, которое перемещает шрифт в нужное место (для этого требуется некоторое математическое мышление), нарисуйте текст, затем замените перевод на ваш масштабирующий перевод и нарисуйте остальные. – lbalazscs

+0

Я попытался изменить размер шрифта, но я не смог получить из него хороший результат :(Я добавил синтаксис, который я использовал для изменения размера. – 427

Смежные вопросы