2016-12-01 93 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

非常感谢!这是因为我累了;) –