2011-01-12 12 views
4

JAppletのコンテンツをhtmlで指定されたサイズに自動的に拡大するプロジェクトに取り組んでいます。私はこれがレイアウトマネージャーのために作られたものだと認識していますが、アプレットの構造全体を書き直すことは許されませんので、塗料をオーバーライドしてGraphicsオブジェクトのAffineTransformを適切にスケーリングしたバージョン次に、上部のコンテナにマウスイベントをキャプチャし、適切なスケーリング変換を使用してそれらをスケールし直します。イムは現時点で描画部分に詰まっています。 Webブラウザで表示すると、スケーリングされたバージョンが正しく1回レンダリングされ、イメージは元のサイズに縮小されます。また、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のペイント方法があまり頻繁に呼び出されないことがわかった。代わりにコンテンツペインには独自の描画面があるので、コンテンツペインを置き換えてアップロードするだけでした。私はそれをしなかった相続方法:

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

これらの塗装方法は、アプレット内のものに加えて、当然でした。

関連する問題