为什么我可以在框架上绘制但不能在容器内绘制?
Why can I draw on the frame but not inside a container?
你能帮忙吗?我想画一个圆。所以我做了下面的圆class。我可以通过将圆添加到框架来绘制圆,但不能先将其添加到面板,然后再将面板添加到框架。我想做后者,因为我想要多个圈子。
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
class:
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
上画了多个圆圈。感谢您的任何回答。
frame.add(container); // <- this does not draw
frame.add(circle);// <- this draws the circle
首先,一个组件只能有一个父组件,所以你不能将“圆”添加到“容器”,然后再添加到“框架”。 “圆圈”将从“容器”中移除。
所以我假设您一次只测试一个语句。
每个组件应确定自己的首选大小。
container.setPreferredSize(new Dimension(400,400));
您不应设置面板的首选大小。面板将根据添加到面板的组件的首选大小来确定自己的首选大小。
问题是“圆”class 无法确定自己的首选大小。
在构造函数中,您需要如下代码:
int width = x + rectWidth;
int height = y + rectHeight;
setPreferredSize( new Dimension(width, height) );
现在,当您将 Circle 添加到面板时,面板的布局管理器就可以完成它的工作了。
或者,如果将 Circle 添加到框架中,内容窗格的布局管理器就可以完成它的工作。
你能帮忙吗?我想画一个圆。所以我做了下面的圆class。我可以通过将圆添加到框架来绘制圆,但不能先将其添加到面板,然后再将面板添加到框架。我想做后者,因为我想要多个圈子。
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
class:
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
上画了多个圆圈。感谢您的任何回答。
frame.add(container); // <- this does not draw
frame.add(circle);// <- this draws the circle
首先,一个组件只能有一个父组件,所以你不能将“圆”添加到“容器”,然后再添加到“框架”。 “圆圈”将从“容器”中移除。
所以我假设您一次只测试一个语句。
每个组件应确定自己的首选大小。
container.setPreferredSize(new Dimension(400,400));
您不应设置面板的首选大小。面板将根据添加到面板的组件的首选大小来确定自己的首选大小。
问题是“圆”class 无法确定自己的首选大小。
在构造函数中,您需要如下代码:
int width = x + rectWidth;
int height = y + rectHeight;
setPreferredSize( new Dimension(width, height) );
现在,当您将 Circle 添加到面板时,面板的布局管理器就可以完成它的工作了。
或者,如果将 Circle 添加到框架中,内容窗格的布局管理器就可以完成它的工作。