【问题标题】:Graphics not showing in JLayeredPane (java swing)图形未显示在 JLayeredPane (java swing) 中
【发布时间】:2011-12-17 20:06:55
【问题描述】:

我正在尝试根据用户输入逐步构建图像。我想要做的是创建一堆图形并将它们添加为图层,但是我遇到了一些问题,因为它们不会出现。这是我正在使用的代码:

public class ClassA 
{
    protected final static int dimesionsY = 1000;
    private static int dimesionsX;
    private static JFrame window;
    private static JLayeredPane layeredPane;

    public void init()
    {
        window = new JFrame("Foo");
        dimesionsX = // some user input
        window.setPreferredSize(new Dimension(dimesionsX, dimesionsY));
        window.setLayout(new BorderLayout());

            layeredPane = new JLayeredPane();
        layeredPane.setBounds(0, 0, dimesionsX, dimesionsY);
        window.add(layeredPane, BorderLayout.CENTER);

            ClassB myGraphic = new ClassB();    
        myGraphic.drawGraphic();

        layeredPane.add(myGrpahic, new Integer(0), 0);

        window.pack();
        window.setVisible(true);
    }
}



public class ClassB extends JPanel
{
    public void drawGraphic()
    {
        repaint();
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        g.setColor(Color.BLACK);
        g.fillRect(10, 10, 100, 100);
    }
}

但是我的图形似乎没有出现,我不明白为什么。我也尝试过先将其添加到JPanel,然后将JPanel 添加到JLayeredPane,但这也不起作用。

有人可以帮帮我吗?

【问题讨论】:

    标签: java swing graphics jlayeredpane


    【解决方案1】:

    如果您将组件添加到 JLayeredPane,就像使用容器将其添加到空布局:您必须完全指定组件的大小和位置。

    例如,

    import java.awt.*;
    
    import javax.swing.*;
    
    public class ClassA {
       protected final static int dimesionsY = 800;
       protected final static int dimesionsX = 1000; //!!
       private static JFrame window;
       private static JLayeredPane layeredPane;
    
       public void init() {
          window = new JFrame("Foo");
          // !! dimesionsX = // some user input
    
          //!! window.setPreferredSize(new Dimension(dimesionsX, dimesionsY));
          window.setLayout(new BorderLayout());
    
          layeredPane = new JLayeredPane();
          //!! layeredPane.setBounds(0, 0, dimesionsX, dimesionsY);
          layeredPane.setPreferredSize(new Dimension(dimesionsX, dimesionsY));
          window.add(layeredPane, BorderLayout.CENTER);
    
          ClassB myGraphic = new ClassB();
          myGraphic.drawGraphic();
    
          myGraphic.setSize(layeredPane.getPreferredSize());
          myGraphic.setLocation(0, 0);
          //!! layeredPane.add(myGraphic, new Integer(0), 0);
          layeredPane.add(myGraphic, JLayeredPane.DEFAULT_LAYER);
    
          window.pack();
          window.setVisible(true);
       }
    
       public static void main(String[] args) {
          new ClassA().init();
       }
    }
    
    class ClassB extends JPanel {
       public void drawGraphic() {
          repaint();
       }
    
       public void paintComponent(Graphics g) {
          super.paintComponent(g);
    
          g.setColor(Color.BLACK);
          g.fillRect(10, 10, 100, 100);
       }
    }
    

    【讨论】:

    • 另外,如果您将 JPanel 叠放在一起,希望您注意将 opaque 设置为 false。您的问题的另一种解决方案包括将 BufferedImage 层叠在一起。
    • 感谢您对此的帮助。我注意到您在添加图形时使用了JLayeredPane.DEFAULT_LAYER。我只是想知道在我想添加其他图形的情况下最好使用什么?
    • 我会使用任何逻辑来达到最佳效果。如果我有一些我知道会在底部的东西,我会把它放在默认层中。
    • 好吧,这是有道理的。我将如何添加一个图层以使其位于所有内容之上?
    • @JonW09:将它添加到 JLayeredPane 时,它​​只需要具有最高的 Integer(...) 常量。另请查看 JLayeredPane API,了解 Swing 使用的默认常量,您也可以使用。
    【解决方案2】:

    参见Laying Out Components in a Layered Pane,来自Java 教程

    另外,有时您需要设置首选尺寸:

    layeredPane.setPreferredSize(new Dimension(width, height));

    【讨论】:

      猜你喜欢
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      相关资源
      最近更新 更多