2011-01-12 8 views
4

Ich arbeite an einem Projekt, um eine JApplet Inhalte automatisch auf die Größe im HTML-Format skalieren. Ich weiß, das ist die Art von Dingen, für die Layout-Manager gemacht wurden, aber da ich nicht die gesamte Applets-Struktur schreiben darf, entschied ich, dass ich versuchen würde, Farbe zu überschreiben und einfach die AffineTransform des Graphics-Objekts auf eine entsprechend skalierte Version zu setzen , erfassen Sie dann Mausereignisse im oberen Container und skalieren Sie sie mit einer entsprechenden Skalierungstransformation zurück. Ich bleibe im Moment auf dem Zeichnungsteil stecken. Wenn es in einem Webbrowser angezeigt wird, wird die skalierte Version einmal korrekt gerendert, und das Bild wird auf die ursprüngliche Größe verkleinert. Außerdem scheint es, dass die Paint-Methode in JApplet nur einmal aufgerufen wird. Hier ist eine gekürzte Version meines Codes, der sich auf das Problem konzentriert. Jede Hilfe wäre willkommen. Danke im Voraus.überschreiben malen Methode in 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

Nicht ganz das gleiche Problem, aber [hier] (http://stackoverflow.com/questions/2244157/reverse-java-graphics2d-scaled-and-rotated-coordinates) ist ein Beispiel für das Speichern einer Transformation beim Malen verwendet und verwenden Sie es, um Mauskoordinaten auf Pixel im Quellbild abzubilden. – finnw

Antwort

1

ich herausgefunden, nach viel Forschung, dass das Problem war, dass sehr oft JApplet der paint-Methode nicht aufgerufen wird. Der Inhaltsbereich hat stattdessen eine eigene Zeichenfläche. Daher musste ich einfach den Inhaltsbereich ersetzen, um ihn hochzuladen. heres die Art, wie ich es tat:

@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); 
} 

diese Farbe Methoden waren natürlich zusätzlich zu den in dem Applet.