2017-10-16 59 views
0

所以我一直在這個問題上停留了一段時間,而且我非常渴望獲得幫助。請幫幫我。我有3個類:在Java GUI中創建實例的畫圓

圓形只是假設在由Frame創建的框架中隨機起始位置(並定義半徑)繪製一個圓。

框架是addCircle(),bounce(),start(),stop(),run()(移動圓圈)和quit()方法的主類。這個類還創建了圓圈添加到的框架。

Interfa只是現在一個界面框架,我定義了半徑,圓圈數量和框架大小。

無論我怎麼努力,我不能添加兩個以上的圓(一個是彩色的,一個是不是):

的「遞歸的方式」:

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,這種只允許一個單一的組件被放置在每五個可用位置
  • 佈局管理器依靠的preferred/minimum/maximumSize提示以確定組件的大小。他們還負責決定組件的放置位置。在當前的實現,這將意味着,它可能爲你繪製超出部分
  • 重寫paint不推薦的可見光範圍內,並沒有打電話給super.paint可能會導致一些意外和難以診斷的問題
  • 繪畫可以發生在任何時間,所以在paint方法使用隨機值會造成用戶界面不斷地改變

相反,你可以定義自己的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(); 
     } 
    } 

} 

你們其中一人似乎缺乏理解的事情是如何畫實際上是在Swing工作。

首先查看Performing Custom PaintingPainting in AWT and Swing瞭解更多詳情。

更深入理解佈局管理器和組件層次結構如何工作也不會造成傷害