【问题标题】:Use java awt drawRect from a separate method?从单独的方法中使用java awt drawRect?
【发布时间】:2019-07-18 11:12:02
【问题描述】:

我正在尝试逐个像素地绘制谢尔宾斯基的三角形,该三角形会在窗口大小发生变化时自行调整大小。我相信我已经完成了大部分项目,但我不太清楚如何从 paintComponent 方法之外的单独递归函数中绘制矩形。

public class SierpTriangle extends JPanel 
{
    public final int x = this.getWidth();
    public final int y = this.getHeight();
    public final int side = getsize();

    public int getsize()
    {
        int width = this.getWidth();
        int height = this.getHeight();
        if (width <= height) 
        {
            return width;            
        } 
        else 
        {
            return height;             
        }
    }

    public void paintComponent(Graphics g) 
    {
        super.paintComponent(g);
        drawSierpTriangle(this.x, this.y, this.side);
        g.drawRect(x,y,1,1);
    }

    public void drawSierpTriangle(int x, int y, int size) 
    {
        if (size == 1)
        {
            //Draw rectangle? This is where I need help

            g.drawRect(x,y,1,1); //this does not work, passing Graphics g into the method also does not work
        } 
        else 
        {
            drawSierpTriangle(x/2, y, size/2);
            drawSierpTriangle(x,y/2,size/2);
            drawSierpTriangle(x/2,y/2,size/2);
        }   
    }

    public static void main(String[] args)
    {
        new SierpFrame();
    }
}

【问题讨论】:

    标签: java swing user-interface awt drawrect


    【解决方案1】:

    Graphics的引用从paintComponent传递给drawSierpTriangle

    public void paintComponent(Graphics g) 
    {
        super.paintComponent(g);
        drawSierpTriangle(g, this.x, this.y, this.side);
        g.drawRect(x,y,1,1);
    }
    
    public void drawSierpTriangle(Graphics g, int x, int y, int size) 
    {
        if (size == 1)
        {
            //Draw rectangle? This is where I need help
    
            g.drawRect(x,y,1,1); //this does not work, passing Graphics g into the method also does not work
        } 
        else 
        {
            drawSierpTriangle(g, x/2, y, size/2);
            drawSierpTriangle(g, x,y/2,size/2);
            drawSierpTriangle(g, x/2,y/2,size/2);
        }   
    }
    

    这会导致:在第一次递归调用该方法时,线程“AWT-EventQueue-0”java.lang.StackOverflowError 中出现异常。有什么意见吗?

    public final int side = getsize();
    

    将使side 永远成为0

    用类似...的东西替换它

    public int getSide() {
        int width = this.getWidth();
        int height = this.getHeight();
        if (width <= height) {
            return width;
        } else {
            return height;
        }
    }
    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        int side = getSide();
        if (side == 0) return;
        drawSierpTriangle(g, this.x, this.y, side);
        g.drawRect(x, y, 1, 1);
    }
    

    这将在每次绘制组件时评估side。如果边是0,它也会跳过绘制形状

    xy 也会有同样的问题,因为它们的状态永远不会改变

    【讨论】:

    • 这会导致:线程“AWT-EventQueue-0”java.lang.StackOverflowError 在第一次递归调用该方法时出现异常。有什么意见吗?
    • @flashield 验证退出条件,size 是否有可能成为1?另外,请注意,getSize 中已经有一个方法被调用,定义在 JPanel
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2021-04-19
    • 2012-04-13
    相关资源
    最近更新 更多