2017-10-16 8 views
0

これはしばらくの間この問題に悩まされており、私は助けが切望されています。私を助けてください。私は3つのクラスを持っています:Java GUIでインスタンスとして作成された円を描く

円は、ランダム開始位置(と半径を定義する)で作成されたフレームに円を描くと仮定します。

フレームは、addCircle()、bounce()、start()、stop()、run()(円の移動)、quit()などのメソッドを持つメインクラスです。このクラスは、サークルが追加されるフレームも作成します。

インターファーは、ちょうど今のところ、私が半径、円の数、およびフレームのサイズを定義するインテーフェースフレームです。

どんなに私は(1が着色され、1つはありません)つ以上の円を追加することはできませんしようとするもの:

「再帰的な方法」:

private static void addCircle(int n){ 
    Circle[] circles = new Circle[n+10]; 
    if (n > 0){ 
     circles[circleAdd] = new Circle(); 
     frame.add(circles[circleAdd]); 
     circleAdd = circleAdd + 1; 
     addCircle(n-1); 
    } 
    } 

ノーマルitterative方法

private static void addCircles(int n){ 
    ArrayList<Circle> circles = new ArrayList<Circle>(); 
    for(int i = 0; i<=n;i++){ 
    circles.add(new Circle()); 
    frame.add(circles.get(i)); 
    } 
} 

これは私が私のフレームを作成する方法である:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 

public Class Frame{ 

    private static JFrame frame; 
    private static int circleAdd = 0; 
    private static JPanel fra; 

    public static void mainFrame(){ 
    frame = new JFrame(); 
    frame.setSize(500,500); 
    frame.setVisible(true); 
    fra = new JPanel(); 
    frame.add(fra); 
... 
//addCircle and addCircles 
... 
public static void main.. 
    } 
} 

これは私のサークルです:私はあなたの一般的なアプローチが間違っていることを示唆している

import java.awt.*; 
import javax.swing.*; 
import java.util.Random; 

public class Circle extends JPanel{ 
    private Random random = new Random(); 

    public void paint(Graphics g){ 

    int randX = random.nextInt(250)+50; 
    int randY = random.nextInt(250)+50; 
    g.drawOval(randX,randY,50,50); 
    g.setColor(Color.ORANGE); 
    g.fillOval(100,100,50,50); 
    } 

} 
+0

間違ったGUIフレームワークを使用していると思います。 Swingの後継者である[JavaFX](https://docs.oracle.com/javase/8/javafx/get-started-tutorial/index.html)に切り替える必要があります。そこには '' Circle'(https://docs.oracle.com/javase/8/javafx/api/javafx/scene/shape/Circle.html)のクラスがあり、それをアニメーション化するのに役立つ多くのクラスがあります。 –

答えて

2

。要素としてJPanelを使用する代わりに、任意の数の「円」をペイントできるJPanelが必要です。 Graphics2D APIは複雑な図形(楕円形を含む)を描画することができます。私が見ることができる

主な問題は、次のとおり、デフォルトで

  • JFrameするBorderLayoutを使用して、これは、単一の成分が
  • レイアウトマネージャは、に依存して5つの利用可能な位置のそれぞれに配置することを可能にしますpreferred/minimum/maximumSizeコンポーネントのサイズに関する決定を行うヒント。また、コンポーネントの配置場所を決定する責任も負います。あなたの現在の実装では、これはあなたが
  • オーバーライドpaintがお勧めされていないコンポーネントの可視範囲を超えてペイントすると、super.paintを呼び出しに失敗すると、予期しないと難しいの数が問題を診断する可能性がありますのためにそれが可能だということを意味します
  • 絵画はpaint方法でランダムな値を使用すると、UIは常にその代わり

を変更する原因となりますので、いつでも発生する可能性があり、あなたが望む位置とサイズを取り、単にとして機能し、独自のCircleクラスを定義することができますコンテナ

public class Circle { 
    private int x; 
    private int y; 
    private int radius; 

    private Ellipse2D shape; 

    public Circle(int x, int y, int radius) { 
     this.x = x; 
     this.y = y; 
     this.radius = radius; 

     this.shape = new Ellipse2D.Double(x, y, radius * 2, radius * 2); 
    } 

    public int getX() { 
     return x; 
    } 

    public int getY() { 
     return y; 
    } 

    public int getRadius() { 
     return radius; 
    } 

    public Rectangle getBounds() { 
     return shape.getBounds(); 
    } 

    public void paint(Graphics2D g2d) { 
     g2d.setColor(Color.ORANGE); 
     g2d.fill(shape); 
    } 
} 

これは単にコンテナクラスであり、目的の結果を生成するために必要な情報を表します。それは、形状そのものを描くことができる納得できる方法を持っています。

あなたはその後、これらの形状のListを作成し、コンポーネントあなたは絵が実際のスイングでどのように働くかある中での理解が不足しているように見えるものの

public class TestPane extends JPanel { 

    private List<Circle> circles = new ArrayList<>(10); 
    private Dimension size; 

    public TestPane() { 
     Random random = new Random(); 
     int maxX = 0; 
     int maxY = 0; 
     for (int index = 0; index < 10; index++) { 
      int randX = random.nextInt(250) + 50; 
      int randY = random.nextInt(250) + 50; 
      circles.add(new Circle(randX, randY, 25)); 

      maxX = Math.max(maxX, randX + 50); 
      maxY = Math.max(maxY, randY + 50); 
     } 
     size = new Dimension(maxX, maxY); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return size; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     for (Circle circle : circles) { 
      Graphics2D g2d = (Graphics2D) g.create(); 
      circle.paint(g2d); 
      g2d.dispose(); 
     } 
    } 

} 

一つにそれらをペイントする必要があります。

詳細はPerforming Custom PaintingPainting in AWT and Swingからご覧ください。

レイアウトマネージャとコンポーネント階層がどのように機能するかについての深い理解

関連する問題