为啥我可以在框架上绘制但不能在容器内绘制?

Posted

技术标签:

【中文标题】为啥我可以在框架上绘制但不能在容器内绘制?【英文标题】:Why can I draw on the frame but not inside a container?为什么我可以在框架上绘制但不能在容器内绘制? 【发布时间】:2021-03-23 20:30:27 【问题描述】:

您能帮忙吗?我想画一个圆圈。所以我在下面创建了 Circle 类。我可以通过将圆添加到框架来绘制圆,但不能通过将其添加到面板然后将面板添加到框架来绘制圆。我想做后者,因为我想要多个圈子。

public class Circle extends Canvas
    int x;
    int y;
    int rectwidth;
    int rectheight;

    public Circle(int x, int y, int r) 
        this.x=x;
        this.y=y;
        this.rectwidth=r;
        this.rectheight=r;
    

    public void paint (Graphics g) 
        Graphics2D g2 = (Graphics2D) g;
        super.paint(g);
        // draw Ellipse2D.Double
        g2.draw(new Ellipse2D.Double(x, y, rectwidth, rectheight));
        g2.setColor(Color.BLACK);
    

以下内容取自View类:

Panel container = new Panel();
container.setPreferredSize(new Dimension(400,400));
container.setLayout(new BorderLayout());
Circle circle = new Circle(20,20,200);
container.add(circle, BorderLayout.CENTER);
frame.add(container); // <- this does not draw
frame.add(circle);// <- this draws the circle   
frame.pack();
frame.setVisible(true);

我用FlowLayout试了一下,没有布局,去掉pack(),去掉preferredSize,在Frame上画了多个圆圈。感谢您的任何回答。

【问题讨论】:

使用 awt 代替 Swing 是否有特定原因? 我正在做的课程只教AWT。 你真的应该找一门新的课程,AWT已经死了20年了。 【参考方案1】:
frame.add(container); // <- this does not draw
frame.add(circle);// <- this draws the circle   

首先,一个组件只能有一个父组件,因此您不能将“圆”添加到“容器”,然后再添加到“框架”。 “圆圈”将从“容器”中删除。

所以我假设你一次只测试一个语句。

每个组件都应确定自己的首选尺寸。

container.setPreferredSize(new Dimension(400,400));

您不应该设置面板的首选尺寸。面板将根据添加到面板的组件的首选尺寸确定自己的首选尺寸。

问题在于“Circle”类无法确定自己的首选大小。

在构造函数中你需要如下代码:

int width = x + rectWidth;
int height = y + rectHeight;
setPreferredSize( new Dimension(width, height) );

现在,当您将 Circle 添加到面板时,面板的布局管理器可以完成其工作。

或者,如果您将 Circle 添加到框架中,内容窗格的布局管理器就可以完成它的工作。

【讨论】:

谢谢你真的很有帮助。我现在可以在面板上绘制多个圆。

以上是关于为啥我可以在框架上绘制但不能在容器内绘制?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我第一次单击按钮时不能在 Qt Widget 上绘制点

为啥 Pyglet 不能正确绘制多边形?

为啥给 div 一个背景颜色在其边框上绘制?

为啥我不能在 pyqt5 gui 中嵌入的 matplotlib 颜色图中成功绘制感兴趣区域?

使用光流的汽车跟踪。为啥向量不能正确绘制

为啥在这种情况下 python 不能绘制我的函数?