在分层窗格上绘制到 JPanel

问题描述

我想要做的是自定义绘制到附加到分层窗格中的一个图层的 JPanel。

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

JFrame frame = new JFrame();
frame.add(new CustomPaintComponent());

我有这个并调用 CustomPaintComponent,绘制到创建的测试框架 - 一切正常。但是...如果我尝试相同的方法(如下)但使用窗格而不是框架,则甚至不会调用 CustomPaintComponent,更不用说生成与简单地添加到框架时得到的相同的绘图了。

pane.add(new CustomPaintComponent(),JlayeredPane.POPUP_LAYER);

如果您对此提供任何支持/建议,我将不胜感激。为什么不调用方法 - 我应该做一些不同的事情(也许很多 :P)吗?

下面的简单示例

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

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);

    }
    
}

DrawImage 类进行实际绘制

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);
 
                 }
    
}

解决方法

我想主要问题是您的自定义组件没有“大小”,所以没有什么可绘制的。

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

阅读有关 How to Use Layered Panes 的 Swing 教程中的部分,了解一个工作示例。

另外,不要使用 POPUP_LAYER。这仅用于临时显示组件。