2011-01-12 4 views
4

Я работаю над проектом, чтобы содержимое JApplet автоматически масштабировалось до размера, указанного в html. Я понимаю, что это именно то, для чего были созданы менеджеры макетов, однако, поскольку мне не разрешено переписывать всю структуру апплетов, я решил, что попытаюсь переопределить краску и просто установить AffineTransform объекта Graphics в соответствующую масштабированную версию , затем захватите мыши События в верхнем контейнере и масштабируйте их с помощью соответствующего масштабирующего преобразования. Я сейчас застрял на чертежной части. При просмотре в веб-браузере он отображает масштабированную версию правильно один раз, а затем изображение уменьшается до первоначального размера. Кроме того, кажется, что метод рисования в JApplet называется только один раз. Вот кадрированная версия моего кода, которая фокусируется на проблеме. Любая помощь будет оценена по достоинству. Заранее спасибо.метод переопределения краски в JApplet

import javax.swing.JApplet; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.AffineTransform; 

public class Test extends JApplet 
{ 
     public static final int ORIGINAL_APPLET_WIDTH = 1024; 
     public static final int ORIGINAL_APPLET_HEIGHT = 800; 
     private AffineTransform scalingTransform; 
     private AffineTransform inverseScalingTransform; 
@Override 
public void init() 
{ 
      double xFactor = ((double)(this.getWidth()))/((double)(Test.ORIGINAL_APPLET_WIDTH)); 
      double yFactor = ((double)(this.getHeight()))/((double)(Test.ORIGINAL_APPLET_HEIGHT)); 
      this.scalingTransform = new AffineTransform(); 
      this.inverseScalingTransform = new AffineTransform(); 
      this.scalingTransform.scale(xFactor,yFactor); 
      this.inverseScalingTransform.scale(1D/xFactor,1D/yFactor); 
} 
    @Override 
    public void paint(Graphics g) 
    { 
     ((Graphics2D)g).setTransform(Test.this.scalingTransform); 
     super.paint(g); 
    } 
} 
+0

Не совсем та же проблема, но [здесь] (http://stackoverflow.com/questions/2244157/reverse-java-graphics2d-scaled-and-rotated-coordinates) является примером сохранения преобразования, используемого при рисовании и использовать его для сопоставления координат мыши с пикселями исходного изображения. – finnw

ответ

1

я понял, после долгих исследований, что проблема заключалась в том, что метод краски JApplet в не дозвонились очень часто. Вместо этого область содержимого имеет свою собственную поверхность рисования, поэтому мне просто пришлось заменить панель содержимого, чтобы загрузить ее. Heres как я сделал это:

@Override 
    public void init() 
    { 
      double xFactor = ((double)(this.getWidth()))/((double)(qt.ORIGINAL_APPLET_WIDTH)); 
      double yFactor = ((double)(this.getHeight()))/((double)(qt.ORIGINAL_APPLET_HEIGHT)); 
      this.scalingTransform = new AffineTransform(); 
      this.inverseScalingTransform = new AffineTransform(); 
      this.scalingTransform.scale(xFactor,yFactor); 
      this.inverseScalingTransform.scale(1D/xFactor,1D/yFactor); 
      JPanel drawScale = new JPanel() 
      { 
       @Override 
       public void paint(Graphics g) 
       { 
        ((Graphics2D)g).setTransform(Test.this.scalingTransform); 
        super.paint(g); 
       } 
       @Override 
       public void paintAll(Graphics g) 
       { 
        ((Graphics2D)g).setTransform(Test.this.scalingTransform); 
        super.paintAll(g); 
       } 
       @Override 
       public void paintComponents(Graphics g) 
       { 
        ((Graphics2D)g).setTransform(Test.this.scalingTransform); 
        super.paintComponents(g); 
       } 
       @Override 
       public void paintComponent(Graphics g) 
       { 
        ((Graphics2D)g).setTransform(Test.this.scalingTransform); 
        super.paintComponents(g); 
       } 
      }; 
      Container oldPane = this.getContentPane(); 
      drawScale.setLayout(oldPane.getLayout()); 

      this.setContentPane(drawScale); 
} 

эти методы краски были, конечно, в дополнение к тем, что в апплет.

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