2016-03-20 15 views
1

私は、図形をJavaで再スケーリングする最も簡単な方法が必要です(たとえば、長方形...)。私は、「ストレッチ」、それらをする方法を見つけた:Java(JFrame)で図面のサイズを変更してください

import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JFrame; 
import java.awt.Dimension; 

public class Stretch extends JFrame { 
    int originalHeight = 600; 
    int originalWidth = 600; 
    public Stretch() { 
     super("Stretch"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(originalWidth, originalHeight); 
    } 
    public static void main(String[] args) { 
     Stretch s = new Stretch(); 
     s.setVisible(true); 
    } 
    public void paint(Graphics g) { 
     Dimension size = this.getBounds().getSize(); 
     int rectWidth = 100; 
     int rectHeight = 130; 

     g.setColor(Color.white); 
     g.fillRect(0, 0, size.width, size.height); 

     g.setColor(Color.black); 
     g.drawRect(100, 100, rectWidth + size.width - originalWidth, rectHeight + size.height - originalHeight); 

    } 
} 

あなたは数式がそのようである見ることができるように:

g.drawRect(100, 100, rectWidth + size.width - originalWidth, rectHeight + size.height - originalHeight); 

が今どのように私は、図面を再スケールすることができますか?幅と高さは同じ比率を維持する必要があります。 ありがとうございます。

+0

を探している私は、描画が何であるかわからないものです。それは長方形ですか?またはより複雑な描画のプレースホルダの四角形ですか? –

+0

とにかく、問題の長方形などのベクトルグラフィックスを拡大/縮小する場合は、比を維持したい場合は、比率を維持して目標サイズを再計算してください:まず比率を計算し、幅(または高さ)またはそれを比率で除算して、もう一方の次元を取得します。 –

+0

最も単純な方法は、 'Rectangle'または' Rectangle2D'を使い、単純に拡大縮小された 'AffineTransform'をそれに適用することです。それ以外の場合は、プロパティまたは 'Graphics'コンテキストをスケールすることができます – MadProgrammer

答えて

1

このための2つの異なるアプローチbasciallyがあります:あなたは「全体を拡大縮小Graphics」することができます

  • をあなたは拡張することができます実際の形状

場合によっては微妙な違いがありますが、重要な場合があります。 Graphics全体をスケーリングし、次にはスケーリングされます。特に、2.0を基準にして、幅が1.0の線を描画すると、線は2ピクセル幅で描画されます。これが望ましいかどうかは、アプリケーションの場合によって異なります。

実際の形状を拡大縮小するには、drawRectメソッドを使用できません。代わりに、幾何学的形状を表すShapeのインスタンスを作成する必要があります。 AffineTransform#createTransformedShapeを使用して、これらのシェイプのスケーリングされたバージョンを作成できます。

ここでは、両方のアプローチを比較して、コード内にあるその他の問題のいくつかを修正する例を示します。どちらの場合も、元のサイズが(10,13)の同じ長方形が塗りつぶされ、5.0倍に拡大されます。

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Shape; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.Rectangle2D; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class ScalingDrawnObjects 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     ScalingDrawnObjectsPanel p = new ScalingDrawnObjectsPanel(); 
     f.getContentPane().add(p); 
     f.setSize(600,400); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 

class ScalingDrawnObjectsPanel extends JPanel 
{ 
    @Override 
    protected void paintComponent(Graphics gr) 
    { 
     super.paintComponent(gr); 
     Graphics2D g = (Graphics2D)gr; 

     Shape rectangle = new Rectangle2D.Double(2, 2, 10, 13); 

     g.setColor(Color.RED); 
     drawWithScaledGraphics(g, rectangle); 

     g.translate(100, 0); 

     drawScaledObject(g, rectangle); 
    } 

    private static void drawWithScaledGraphics(Graphics2D g, Shape shape) 
    { 
     AffineTransform oldAt = g.getTransform(); 
     g.scale(5.0, 5.0); 
     g.draw(shape); 
     g.setTransform(oldAt); 
    } 

    private static void drawScaledObject(Graphics2D g, Shape shape) 
    { 
     AffineTransform at = AffineTransform.getScaleInstance(5.0, 5.0); 
     g.draw(at.createTransformedShape(shape)); 
    } 

} 
コメント

私は投稿のコードに対応して


EDITは "複雑" ではありません。それは、そうでなければならないほど集約されていますが、それ以上はありません。 JFrameを拡張してはならず、paintを上書きしないでください。 EDTにGUIを作成する必要があります。あなたは...

ただし、以下のようなコードを使用してはならないはずですが、多分これはあなたが

import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JFrame; 
import java.awt.Dimension; 

public class Stretch extends JFrame { 
    int originalHeight = 600; 
    int originalWidth = 600; 
    public Stretch() { 
     super("Stretch"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(originalWidth, originalHeight); 
    } 
    public static void main(String[] args) { 
     Stretch s = new Stretch(); 
     s.setVisible(true); 
    } 
    public void paint(Graphics g) { 
     Dimension size = this.getBounds().getSize(); 
     int rectWidth = 100; 
     int rectHeight = 130; 

     g.setColor(Color.white); 
     g.fillRect(0, 0, size.width, size.height); 

     g.setColor(Color.black); 

     int w = rectWidth + size.width - originalWidth; 
     int h = rectHeight + size.height - originalHeight; 
     double sx = (double)w/rectWidth; 
     double sy = (double)h/rectHeight; 
     double s = Math.min(sx, sy); 
     int fw = (int)(s * rectWidth); 
     int fh = (int)(s * rectHeight); 
     g.drawRect(100, 100, fw, fh); 

    } 
} 
+0

ありがとうございますが、これは私の目的にとってはあまりにも複雑です。解決策は単なる考え方です – Cris

+0

私は申し訳ありませんが、私は塗料をオーバーライドし、JFrameを延長してください? 最後のコードをありがとう、完璧です。 – Cris

+1

[なぜあなたはJFrameを拡張すべきではありません](http://stackoverflow.com/questions/1143923/why-shouldnt-you-extend-jframe-and-other-components)。 'JFrame'は複雑なトップレベルのコンポーネントであり、' paint'メソッドは内部管理を多くします(フレームのサイズを変更すると図面がちらつくことがあります。これは 'paint'をオーバーライドしたためです。もはや正しく動作しません)。何かをペイントしたいだけの場合、最初のコードスニペットに示されているように、「可能な限り単純なコンポーネント」を使用する必要があります。これは 'paintComponent'をオーバーライドする' JPanel'です。 – Marco13

0

希望のスケールで幅と高さを乗算するとどうですか?

だから、あなたは2でそれを拡張したい場合:

g.drawRect(100, 100, 2 * (rectWidth + size.width - originalWidth), 2 * (rectHeight + size.height - originalHeight)); 
+0

ウィンドウのサイズを変更した場合、図面はそれに応じて縮尺変更する必要があります – Cris

関連する問題