Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当自定义绘制代码位于其他类中时,未执行自定义绘制_Java_Swing_Custom Painting - Fatal编程技术网

Java 当自定义绘制代码位于其他类中时,未执行自定义绘制

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

我正在尝试编写一些自定义的绘画代码。具体来说,我希望有一组扩展的JPanel来绘制GUI的不同方面,但是这些扩展面板中的每一个都包含如何绘制的说明

我已经创建了代码,但是出于某种原因,扩展JPanel没有被绘制在JFrame中的主JPanel上,不管我做什么。这是我的一个要点,也是我的一个想法。我错过了什么

突破 球
在主类的
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);