2016-05-24 3 views
2

ImはRiver-Raidのようなゲームを書いており、すべての画像はg.drawImage(...)で描かれています。 私の質問は:どのようにコンテンツのアスペクト比を維持し、誰かがJFrameのサイズを変更するときに新しいウィンドウのサイズに合わせてコンテンツを拡大するには?JLabelを使わずに画像をサイズ変更

このようなオプションはありますか? JLabelとLayoutsを使用せずにこれを行うことはできますか?そうでない場合、これを他の方法で行う方法は?

またJPanelの

private void doDrawing(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g; 
     drawStrings(g2); 
     mapa.drawMap(g2); 
     ArrayList ms = craft.getMissiles(); 

     for (Object m1 : ms) { 
      Missile m = (Missile) m1; 
      g2.drawImage(m.getImage(), m.getX(), m.getY(), this); 
     } 
     g2.drawImage(craft.getImage(), craft.getX(), craft.getY(), this); 
     for (EnemyJet enemy : enemies) { 
      g2.drawImage(enemy.getImage(), enemy.getX(), enemy.getY(), this); 
     } 
     for (Fuel fuel : fuels) { 
      g2.drawImage(fuel.getImage(), fuel.getX(), fuel.getY(), fuel.getHeight(), fuel.getHeight(), this); 
     } 
     for (Obstacle o : obst) { 
      g2.drawImage(o.getImage(), o.getX(), o.getY(), this); 
     } 
     drawStrings(g2); 
    } 

で物事を描画するために私のコードJPanelのコンストラクタ:

private void initBoard() { 
     addKeyListener(new TAdapter()); 
     setFocusable(true); 
     setBackground(Color.WHITE); 
     setLayout(new GridBagLayout()); 
     craft = new Craft(ICRAFT_X, ICRAFT_Y); 
     mapa = new Mapa(); 
     setMinimumSize(new Dimension(WIDTH, HEIGHT)); 
     initEnemiesAndAddThem(); 
     czas = new Timer(delay, this); 
     czas.start(); 
    } 

のJFrameのコンストラクタ:

private void initGame() 
    { 
     add(new Plansza()); 
     setTitle("Reeevah Raaid"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(WIDTH, HEIGHT); 
     setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
     setLocationRelativeTo(null); 
     pack(); 
     setVisible(true); 
     //setExtendedState(JFrame.MAXIMIZED_BOTH); 
     //setResizable(false); 
    } 

答えて

1

あなたは全体の事拡張することができます:

private void doDrawing(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g; 

    AffineTransform originalTransform = g2.getTransform(); 
    g2.scale(getWidth()/(double) WIDTH, getHeight()/(double) HEIGHT); 

    // Do all drawing here 

    g2.setTransform(originalTransform); 
} 

いくつかの注意を:

  • 最後のg2.setTransform(originalTransform)はインポートです蟻。 Graphicsオブジェクトはあなたのものではなく、他のコンポーネントを描画するために使用される可能性があるため、与えられた時と同じ状態にしておく必要があります。
  • WIDTHとHEIGHTは、Javaでは、除算演算のオペランドのいずれかがdoubleの場合、結果はdoubleですが、両方がintの場合、整数除算が実行されます。あなたは欲しい。 (たとえば、3/(double) 2は1.5ですが、3/2は正確に1です)。
+0

申し訳ありませんが、背景は目に見えるだけなのでスケールが非常に大きくても小さすぎても問題ありませんが、交差点が発生してどこかに見えることがわかります(画像)。私はこのアプローチが好きですが、それは描画のすべての画像で機能するためですが、最終的に何かがスケールに間違っています – tdbr

+0

編集:いくつかの研究の後、intersetcionが発生しますが、画像は表示されません...私は0.5倍または2倍画像が小さすぎたり大きすぎたりすると、私はそれらを見ることはできませんが、目に見えません。 – tdbr

0

任意の画像を以下のように描画する必要がある。

double fct=1.0*image.getWidth()/getWidth(); 
    double fct2=1.0*image.getHeight()/getHeight(); 
    if(fct2>fct) fct=fct2; 
    g2.drawImage(image, x, y, (int)(1.0*image.getWidth()/fct), (int)(1.0*image.getHeight()/fct), this); 

これは空の領域を多く残しますが、これはアスペクト比を維持したい場合です。

-

次のない画像中央に:

int newWidth=(int)(1.0*image.getWidth()/fct); 
int newHeight=(int)(1.0*image.getHeight()/fct); 
g2.drawImage(image, getWidth()/2-newWidth()/2, getHeight()/2-newHeight()/2, newWidth, newHeight, this); 
+0

実際には視覚的部分のサイズが変更されるため、うまく動作します。画像から取る四角形の境界に問題があり、変更されていません。それを作る方法を教えてもらえますか? – tdbr

+0

また、内容が左に浮かんでいます、あなたはどのようにjpanelを中心にすることができますか? – tdbr

関連する問題