首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解paintComponent

理解paintComponent
EN

Stack Overflow用户
提问于 2013-11-09 14:59:32
回答 2查看 143关注 0票数 1

更新19/01/14(针对有类似问题的人)

下面我描述的问题源于我的循环类扩展了JPanel这个事实。因此,我从这个类创建的每一个圆实际上都是它自己的面板。因此,通过添加一个布局,我可以看到两个圆圈。我现在已经了解到,更明智的做法是拥有一个单独的"board类“来扩展JPanel,在这种情况下,让圆不扩展任何东西。这样,我就可以在循环中实现一个drawMySelf方法,并在我的董事会中绘制它们。这样我就可以在同一个面板上有不同的几何物体了!

更新结束。

我在做一个需要画两个圆圈的任务。当我调整我的身体尺寸时,这些圆圈应该被随机地重新定位。需要在它们的中心之间有一条线,表示距离。我的班级给圈子惹麻烦了。当我将我的自定义圆添加到我的测试程序中时,只会出现其中一个。我搞不懂为什么。我认为我的代码中有一个错误,使得程序跳过了其中的一些。因为我只有一个圆圈可以出现。有人能看出这段代码有什么问题吗?

记住,我应该使用到目前为止学到的工具。JPanel,JFrame,重写paintComponent()。

圆周班:

代码语言:javascript
复制
    package oppgave4;
    import javax.swing.*;
    import java.awt.*;

    public class Circle extends JPanel {
    
    public static final int OVAL = 1;
    public static final int ANOTHEROVAL = 2;
    
    public int OVALCENTER = 0;
    public int ANOTHEROVALCENTER = 0;
    
    private int type = 1;
    private boolean filled = false;
    
    public Circle(){
        
    }
    
    public Circle(int type){
        this.type = type;
    }
    
    public Circle(int type, boolean filled){
        this.type = type;
        this.filled = filled;
    }
    
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        
        int width = getWidth();
        int height = getHeight();
        int randomWidth = (int)(width * Math.random());
        int randomHeight = (int)(height * Math.random());
        
        switch (type){
        case OVAL:
            g.setColor(Color.BLUE);
            if(filled)
                g.fillOval(randomWidth, randomHeight, 30, 30);    
            else
                g.drawOval(randomWidth, randomHeight, 30, 30);
      
            
        case ANOTHEROVAL:
            g.setColor(Color.RED);
                if(filled)
                    g.fillOval(randomWidth, randomHeight, 30, 30);
                else
                    g.drawOval(randomWidth, randomHeight, 30, 30);
                break;
            
        }
    }
    
}

测试程序:当我运行这个程序时,只有红色的圆圈会出现。

代码语言:javascript
复制
    package oppgave4;
    import javax.swing.*;
    import java.awt.*;

    public class TestProgram extends JFrame {
        public TestProgram(){
        add(new Circle(Circle.OVAL));
        add(new Circle(Circle.ANOTHEROVAL));
   
        }

    public static void main(String[] args) {
        TestProgram sirkel = new TestProgram();
        sirkel.setSize(400, 300);
        sirkel.setLocationRelativeTo(null);
        sirkel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        sirkel.setVisible(true);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-09 15:27:47

尝试将它们添加到默认的BorderLayout之外的布局管理器中,看看会发生什么

代码语言:javascript
复制
import java.awt.*;    

public TestProgram(){
    setLayout(new GridLayout(1, 2);
    add(new Circle(Circle.OVAL));
    add(new Circle(Circle.ANOTHEROVAL));
}

另一个解决方案就是使用JFrame的默认JFrame。当您只使用.add(something)时,它将自动添加到BorderLayout.CENTER中,除非指定位置。一个BorderLayout,并且每个位置只容纳一个组件。因此,当您尝试添加第二个,只有第二个将出现在CENTER位置。

如果你这么做了

代码语言:javascript
复制
public TestProgram(){
    setLayout(new GridLayout(1, 2);
    add(new Circle(Circle.OVAL), BorderLayout.CENTER);
    add(new Circle(Circle.ANOTHEROVAL), BorderLayout.SOUTH);
}

它也能起作用

票数 1
EN

Stack Overflow用户

发布于 2013-11-09 15:27:09

首先,通过使每个Circle成为一个JPanel,您将得到意想不到的结果,因为两个JPanels不能绘制到相同的位置。相反,他们把我的LayoutManager。在这种情况下,我可以想象你的一个面板在另一个面板上,所以你只看到一个面板。

如果您希望圆圈位于同一个“面板”(它们可以重叠),那么您将需要一个JPanel,它可以绘制多个圆圈。

如果您希望它们在单独的面板中“并排”,我会查看GridLayout

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19877365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档