【问题标题】:Drawing to JPanel on Layered Pane在分层窗格上绘制到 JPanel
【发布时间】:2021-02-10 13:16:37
【问题描述】:

我要做的是自定义绘制到附加到分层窗格中的其中一个层的 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);
 
                 }
    
}

【问题讨论】:

  • 不要使用框架。对于 Swing,您应该使用 JFrame。如果 Frame 是一个自定义类,那么给它一个更具描述性的名称,因为 AWT 也有一个名为 Frame 的组件,这很容易混淆。
  • 谢谢。我正在使用 JFrame - 上面是一个错字。编辑传入。 Frame 框架只是一个示例。

标签: java swing paintcomponent jlayeredpane


【解决方案1】:

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

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

阅读 How to Use Layered Panes 上的 Swing 教程中的部分以获取工作示例。

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

【讨论】:

  • 谢谢。自定义组件确实指定了大小 - 并且在您使用 frame.add(...) 调用它时工作,但在使用 pane.add(...,SPECIFIED LAYER) 时甚至不会被调用 - 注意不使用 POP UP层,谢谢
  • 当你使用 frame.add(...) 调用它时会起作用, - 已经说明了为什么会起作用。 自定义组件确实指定了大小 - 发布正确的minimal reproducible example 来演示问题。
  • 谢谢。上面用基本代码编辑以显示问题。
  • 啊啊啊,我明白了。你是对的 - 这是我需要添加到 JPanel 的 setBounds。在示例之外,有 setSize 的绘制组件的代码未包含在我上面给出的示例中,但我仍然无法理解它!感谢您坚持使用它 - 并在第一次做对时大声喊叫 :) 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 2021-04-14
  • 2011-12-05
  • 2016-09-30
  • 1970-01-01
相关资源
最近更新 更多