Java 当自定义绘制代码位于其他类中时,未执行自定义绘制
我正在尝试编写一些自定义的绘画代码。具体来说,我希望有一组扩展的JPanel来绘制GUI的不同方面,但是这些扩展面板中的每一个都包含如何绘制的说明 我已经创建了代码,但是出于某种原因,扩展JPanel没有被绘制在JFrame中的主JPanel上,不管我做什么。这是我的一个要点,也是我的一个想法。我错过了什么 突破 球Java 当自定义绘制代码位于其他类中时,未执行自定义绘制,java,swing,custom-painting,Java,Swing,Custom Painting,我正在尝试编写一些自定义的绘画代码。具体来说,我希望有一组扩展的JPanel来绘制GUI的不同方面,但是这些扩展面板中的每一个都包含如何绘制的说明 我已经创建了代码,但是出于某种原因,扩展JPanel没有被绘制在JFrame中的主JPanel上,不管我做什么。这是我的一个要点,也是我的一个想法。我错过了什么 突破 球 在主类的showGUI方法中,您有以下代码: JPanel p = new JPanel(); p.add(new Ball(200,200,50,255,0,0)); frame
在主类的
showGUI
方法中,您有以下代码:
JPanel p = new JPanel();
p.add(new Ball(200,200,50,255,0,0));
frame.add(p);
这段代码创建一个新的JPanel,然后向其中添加另一个JPanel。这是不正确的,因为将另一个JPanel
添加到您刚刚创建的完美JPanel
是没有意义的。相反,只需这样做:
frame.getContentPane().add(new Ball(200, 200, 50, 255,0,0));
或者,如果您愿意:
Ball ball = new Ball(200, 200, 50, 255,0,0);
frame.getContentPane().add(ball);
以这种方式使用
JPanel
s将给您带来无尽的问题
你面临的两个主要问题是
JPanel
s已经对尺寸和位置有了概念,添加另一个x/y坐标只是让人困惑,可能会导致您在组件的可视空间中进行绘制JPanel
的默认首选大小为0x0。这意味着当您使用FlowLayout
将其添加到另一个JPanel
时,面板的大小为0x0,因此不会绘制任何内容接口
,该接口有一个名为paint
的方法,并获取一个Graphics2D
对象
对于要绘制的每个形状,创建一个实现此接口的新类
,并使用它的绘制
方法来绘制您认为合适的对象
创建一个自定义组件,从JPanel
扩展,并维护这些形状的列表。在它的paintComponent
中,使用for loop
来绘制列表中的每个形状
然后应该将此自定义组件添加到框架中…您应该使用frame.getContentPane().add()
添加组件。@codennija:为什么?“add()
…已被重写,以便根据需要转发到contentPane
。@trashgood我不知道这一点。但是我觉得getContentPane().add()
更具可读性。外部链接过时了,很少有人会关注它们。为了更快地获得更好的帮助,请发布一个(经过测试且可读性最低的示例)(作为对问题的编辑)。组件已经有了位置和大小的一致性,我建议不要使用这种方法,而是使用一个JPanel
,它将充当画师,然后设计某种“可绘制的”知道如何画自己的类。然后,您可以将这些可绘制对象添加到面板中,并让面板通过paintComponent
方法绘制它们。虽然您的建议可行,但它将OP限制为单个组件。它也未能纠正最初导致问题的根本问题
frame.getContentPane().add(new Ball(200, 200, 50, 255,0,0));
Ball ball = new Ball(200, 200, 50, 255,0,0);
frame.getContentPane().add(ball);