jpanel绘制椭圆形问题



我已经创建了一个应用程序,该应用程序用jpanel和jframe(Ubuntu 16.04中安装了Java 8),绘制随机数的椭圆形(带有随机尺寸和颜色)。一切似乎都是正确的...但是当我执行代码时,没有椭圆形。我只需一个空白屏幕(出现jframe,但只是空白)。

它有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 class

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 class

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);
    }
}

您需要注意椭圆形高度和宽度仅包含正值 - 您的代码不执行此操作。考虑在获取椭圆形属性时使用Math.max,Math.min或Math.abs来帮助您实现此目标。

另外,这是错误的,因为您要重复设置x2错误忽略y2:

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

类似的东西将有效:

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;
}

将来,解决这些类型的问题的关键是使用调试器检查程序的字段,此处的椭圆形属性,随着程序的运行,然后查看它们是否没有意义,并且那为什么。

最新更新