2011-12-25 11 views
3

ペイント/グラフィックスの初心者で、JPanelを自分のコードに追加して、グラフィック全体がJPanel上にあり、JFrame上にないようにする方法を知りたい。言い換えればペイント(またはペイント)でjpanelを使用する方法

、私は私がこれを行うことを可能にするGUIを作成しようとしています:右側に はJTextAreaのを追加し、左側にあるのJPanel 上のラインの素敵な動きを示し、 (JPanel上で)グラフィックの調整を表示します。

  • これは大きな問題を単純化したものですが、ここのコードはわかりやすいものです。

ありがとうございます!

(下図、コードを実行するだけの線を移動したり)

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Line2D; 
import javax.swing.JFrame; 

public class Test extends JFrame implements Runnable 
{ 
    private Line2D line; 

public Test() 
{ 
    super("testing"); 
    this.setBounds(500, 500, 500, 500); 
    this.setVisible(true); 
} 

public void paint(Graphics g) 
{ 
    Graphics2D g2 = (Graphics2D) g; 
    g2.draw(line); 
} 

@Override 
public void run() 
{ 
    int x=50; 
    while (true) 
    { 
     try 
     { 
      Thread.sleep(50); 

      line = new Line2D.Float(100+x, 100+x, 250-x, 260+x%2); 
      x++; 
      repaint(); 
      if (x==5000) 
       break; 

     } catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

public static void main (String args[]) 
{ 
    Thread thread = new Thread (new Test()); 
    thread.start(); 
} 
} 

enter image description here

答えて

5
  1. 代わりのRunnableを実施し、repaint()を呼び出すActionListenerを確立します。 Swing Timerから呼び出します。
  2. これを行うには2通りの方法があります。
    • BufferedImageJComponentまたはJPanel
    • ドローを拡張し、JLabelImageIconにそれを追加します。コンポーネントを拡張する場合は、あなたが行う場合は、さらに子供、またはJPanelを追加する必要がない場合
  3. JComponentを使用しています。いずれの場合もpaint(Graphics)の代わりにpaintComponent(Graphics)を上書きします。
  4. BufferedImageは、(おそらく意図的に持続性のある)一連の系列をアニメーション化しているように見えるので、このユースケースの方が適しているかもしれません。
  5. EDTでスイングGUIを起動する必要があります。
  6. setBoundsに電話しないでください!その代わりに、カスタムコンポーネントに適切なサイズを設定し、テキストエリアのコンストラクタに合理的な値を使用し、それらをレイアウト(および適切なパディングとボーダー)と組み合わせて、すべてのコンポーネントが追加された後にフレームでpack()を呼び出します。
  7. JREが、Threadを開始する前にrepaint()を呼び出した場合、NPEがあります。

..Whatは疑問でしたか?ああ、質問が「他のコンポーネントをカスタム塗装されたコンポーネントと組み合わせる方法」であると推測できるのであれば - ネストされたレイアウトを使用します。 Nested Layout exampleを参照してください。

バッキングストアとしてBufferedImageを使用している場合、あなたはその上でJTableを残すだけでなく、JSplitPaneということを除いて、この例では画像のようにそれを置くかもしれません。

+0

ありがとうございました!私はJPanelを拡張し、paintComponentを使用しました。それはそのトリックを – adhg

+0

うまくやったので、今日は2つのことを学びました。再度ありがとう – adhg

+0

あなたは大歓迎です。両方のカウントについて:-) ;) –

2

これを行うための適切な方法についてCustom Painting上のSwingのチュートリアルを読んでください。

関連する問題