2016-12-01 96 views
0

我創建了一個應用程序,它使用JPanel和JFrame繪製隨機數的橢圓(具有隨機大小和顏色)。一切似乎都是正確的......但是當我執行代碼時不會畫出橢圓。我只收到一個空白屏幕(JFrame出現,但只有空白)。繪圖橢圓的JPanel問題

它有3個類:MyOval,DrawPanel和DrawTest。

MyOval類

package drawingovals; 

import java.awt.Color; 
import java.awt.Graphics; 

public class MyOval { 
    private int x1; 
    private int y1; 
    private int x2; 
    private int y2; 
    private Color myColor; 
    private boolean isFilled; 

    public MyOval(int x1, int y1, int x2, int y2, Color color, boolean isFilled) { 
     this.x1 = x1; 
     this.y1 = y1; 
     this.x2 = x2; 
     this.x2 = x2; 
     myColor = color; 
     this.isFilled = isFilled; 
    } 

    public int getUpperLeftX(){ 
     return x1; 
    } 

    public int getUpperLeftY(){ 
     return y1; 
    } 

    public int getWidth(){ 
     return x2 - x1; 
    } 

    public int getHeight() { 
     return y2 - y1; 
    } 

    public String getColor() { 
     return myColor.toString(); 
    } 

    public boolean getFilling(){ 
     return isFilled; 
    } 

    public void setUpperLeftX(int value) { 
     x1 = value; 
    } 

    public void setUpperLeftY(int value) { 
     y1 = value; 
    } 

    public void setDownRightX(int value) { 
     x2 = value; 
    } 

    public void setDownRightY(int value) { 
     y2 = value; 
    } 

    public void drawNoFill(Graphics g) { 
     g.setColor(myColor); 
     g.drawOval(getUpperLeftX(), getUpperLeftY(), getWidth(), getHeight()); 
    } 

    public void drawFill(Graphics g) { 
     g.setColor(myColor); 
     g.fillOval(getUpperLeftX(), getUpperLeftY(), getWidth(), getHeight()); 
    } 
} 

DrawPanel類

package drawingovals; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.util.Random; 
import javax.swing.JPanel; 

public class DrawPanel extends JPanel{ 
    private Random randomNumbers = new Random(); 
    private MyOval[] ovals; 

    public DrawPanel() { 
     setBackground(Color.WHITE); 

     ovals = new MyOval[5 + randomNumbers.nextInt(5)]; 

     for (int count = 0; count < ovals.length; count++) { 
      int x1 = randomNumbers.nextInt(300); 
      int y1 = randomNumbers.nextInt(300); 
      int x2 = randomNumbers.nextInt(300); 
      int y2 = randomNumbers.nextInt(300); 

      Color color = new Color(randomNumbers.nextInt(256), 
        randomNumbers.nextInt(256), randomNumbers.nextInt(256)); 

      boolean fill = randomNumbers.nextBoolean(); 

      ovals[count] = new MyOval(x1, y1, x2, y2, color, fill); 
     } 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     for (int count = 0; count < ovals.length - 1; count++) { 
      ovals[count].drawFill(g); 
     } 
    } 
} 

DrawTest類

package drawingovals; 

import javax.swing.JFrame; 

public class DrawTest { 

    public static void main(String[] args) { 
     DrawPanel panel = new DrawPanel(); 
     JFrame application = new JFrame(); 

     application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     application.add(panel); 
     application.setSize(400, 400); 
     application.setVisible(true); 
    } 

} 

回答

2

你需要採取關心你的橢圓形高度和寬度只包含正值 - 你的代碼不會這樣做。考慮使用Math.max,Math.min或Math.abs獲取您的橢圓形屬性以幫助您實現此目的。

this.x1 = x1; 
    this.y1 = y1; 
    this.x2 = x2; // *** these are the same 
    this.x2 = x2; // *** these are the same 

像這樣的工作:

而且,你重複設置X2錯誤忽略Y2這是錯誤的

public MyOval(int x1, int y1, int x2, int y2, Color color, boolean isFilled) { 
    this.x1 = Math.min(x1, x2); 
    this.y1 = Math.min(y1, y2); 
    this.x2 = Math.max(x1, x2); 
    this.y2 = Math.max(y1, y2);; 
    myColor = color; 
    this.isFilled = isFilled; 
} 

今後,關鍵是解決這些類型的問題是在程序運行時使用調試器檢查程序的字段(這裏是橢圓形屬性),然後查看它們是否沒有意義,以及爲什麼。

+0

非常感謝!這是因爲我累了;) –