Java 在分层窗格上绘制到JPanel

Java 在分层窗格上绘制到JPanel,java,swing,paintcomponent,jlayeredpane,Java,Swing,Paintcomponent,Jlayeredpane,我要做的是自定义绘制到一个JPanel,该JPanel附加到分层窗格中的一个层上 对于简单的绘图,我发现您可以有效地执行以下操作:- JFrame frame = new JFrame(); frame.add(new CustomPaintComponent()); 我有这个,CustomPaintComponent被调用,绘制到一个创建的测试框架中-所有工作正常。但是…如果我尝试相同的方法(如下),但使用窗格而不是框架,那么CustomPaintComponent甚至不会被调用,更不用说生

我要做的是自定义绘制到一个JPanel,该JPanel附加到分层窗格中的一个层上

对于简单的绘图,我发现您可以有效地执行以下操作:-

JFrame frame = new JFrame();
frame.add(new CustomPaintComponent());
我有这个,CustomPaintComponent被调用,绘制到一个创建的测试框架中-所有工作正常。但是…如果我尝试相同的方法(如下),但使用窗格而不是框架,那么CustomPaintComponent甚至不会被调用,更不用说生成简单添加到框架时得到的相同图形了

pane.add(new CustomPaintComponent(),JLayeredPane.POPUP_LAYER);
如果您能在这方面给予支持/建议,我将不胜感激。为什么不调用该方法-我应该做一些不同的事情(可能很多:P)吗

下面的简单示例

创建JFrame、JLayeredPane和JPanel的示例类(后者访问下面的第二个类)

DrawImage类来进行实际绘图


我想主要的问题是,您的自定义组件没有“大小”,因此没有任何可绘制的内容

将组件添加到JFrame时,布局管理器将为组件提供一个大小。JLayeredPane不使用布局管理器,因此现在您有责任为组件指定大小和位置

请阅读上Swing教程中的部分,以获取一个工作示例


另外,不要使用弹出窗口图层。仅用于组件的临时显示。

不要使用框架。对于Swing,应该使用JFrame。如果Frame是一个自定义类,那么就给它一个更具描述性的名称,因为AWT还有一个名为Frame的组件,这很容易混淆。谢谢。我用的是JFrame——上面是一个打字错误。编辑传入。框架只是一个例子。谢谢。自定义组件确实指定了大小,并且在您使用frame.add(…)调用它时有效,但在使用pane.add(…,指定层)时甚至没有被调用-注意到不使用弹出层,感谢您使用frame.add(…)调用它时有效-已经说明了为什么有效。自定义组件确实指定了一个大小-发布一个正确的示例来演示问题。谢谢。上面用基本代码编辑显示了这个问题。啊,我知道了。你是对的,这是我需要给JPanel添加的挫折。在这个例子之外,还有一些代码指向具有setSize的paint组件,我在上面给出的例子中没有包含它,我仍然无法理解它!!感谢你坚持不懈地坚持下去,并在第一次做对的时候大喊一声:)谢谢!
package example;

import javax.swing.*;

public class Example {

    public static void main(String[] args) {
        
        JLayeredPane forLayers = new JLayeredPane();
        forLayers.setSize(300, 300);
        
        JFrame showsDrawnImage = new JFrame ("JFrame");
        showsDrawnImage.setSize(300, 300);
        
        JPanel panelDrawnOn = new DrawImage();
        
        //CODE BELOW WORKS - and returns string line in output//
        
        showsDrawnImage.add(panelDrawnOn); //blank these out to show the layeredpane example
        showsDrawnImage.setVisible(true); //blank these out to show the layeredpane example
        
        //CODE BELOW DOESN'T WORK - only shows the JFrame and DOES NOT return string line in output//

        forLayers.add(panelDrawnOn, JLayeredPane.PALETTE_LAYER);
        showsDrawnImage.add(forLayers);
        forLayers.setVisible(true);
        showsDrawnImage.setVisible(true);

    }
    
}
package example;

import java.awt.*;
import java.awt.geom.*;
import javax.swing.JPanel;

public class DrawImage extends JPanel{
    
    public void paintComponent( Graphics g ) {
        
                    System.out.println("This is what I try to access/draw");
                    
                    super.paintComponent(g);
                    Graphics2D g2 = (Graphics2D)g;

                    Line2D line = new Line2D.Double(10, 10, 40, 40);
                    g2.setColor(Color.blue);
                    g2.setStroke(new BasicStroke(10));
                    g2.draw(line);
 
                 }
    
}