【问题标题】:Adding two JPanels to a JLayeredPane将两个 JPanel 添加到 JLayeredPane
【发布时间】:2014-07-15 20:07:18
【问题描述】:

我正在尝试将JPanel 添加到JLayeredPane,但仅部分成功。我可以分别看到两个面板,但当我将它们加在一起时就不行了。当我把它们放在一起时,只有 DEFAULT_LAYER 显示。任何想法都会很棒。

import java.awt.image.BufferedImage;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.ImageIcon;
import javax.swing.JLayeredPane;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.*;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Container;
import java.awt.Component;
import java.awt.Insets;
import java.util.ArrayList;
import java.awt.LayoutManager;

public class ImageEditorView 
{
   public static int dimensionWidth  = 1280;
   public static int dimensionHeight = 640;
   private Color currentColor = Color.WHITE;
   private JLayeredPane layeredPane;

   private JPanel createEditPanel()
   {
      final CirclePanel editPanel = new CirclePanel();
      //editPanel.setLayout(new CircleLayout(true));

      editPanel.setBounds(50, 0, 150, 150);
      editPanel.setOpaque(true);

      return editPanel;
   }

   private JPanel createImageView()
   {
      JPanel imageView = new JPanel(new GridBagLayout());
      imageView.setPreferredSize(new Dimension(dimensionWidth, dimensionHeight));
      imageView.setBounds(0, 0, dimensionWidth, dimensionHeight);
      imageView.setBackground(currentColor);
      return imageView;
   }

   private void addToLayeredPane(JComponent component, int level)
   {
      //This prints out what is expected. values of 1 and 100 respectfully
      System.out.println("The level has a value of " + level);
      layeredPane.add(component, level);
   }

   public void createAndShowGUI()
   {
      JFrame f = new JFrame("ImageEditor");
      f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      f.setLocationByPlatform(true);

      layeredPane = new JLayeredPane();
      //Both createImageView and createEditPanel return with the type JPanel
      addToLayeredPane(createImageView(), JLayeredPane.DEFAULT_LAYER);
      addToLayeredPane(createEditPanel(), JLayeredPane.PALETTE_LAYER);

      f.setSize(dimensionWidth, dimensionHeight);
      f.setContentPane(layeredPane);
      f.setMinimumSize(f.getSize());
      f.setVisible(true);
   }
}

class CirclePanel extends JPanel
{
   @Override
   protected void paintComponent(Graphics g)
   {
      g.drawOval(0, 0, g.getClipBounds().width, g.getClipBounds().height);
   }
}

【问题讨论】:

    标签: java swing jpanel jlayeredpane


    【解决方案1】:

    默认情况下,JPanel 是不透明的。因此,您只会看到已添加到顶层的面板。试试:

    panel.setOpaque(false);
    

    在顶部面板上。

    如果您需要更多帮助,请发布正确的SSCCE 来证明问题。您发布的代码无法编译,因此不可执行。

    编辑:

    问题在于您的addToLayeredPane(...) 方法。您正在使用“int”的图层参数。它必须是Integer

    由于您使用 int 值添加组件,因此该组件被正常添加到面板并在其 ZOrder 中绘制,这基本上意味着最后添加的组件首先绘制,因此您的“imageview”被绘制在“编辑视图”。

    另外,您仍然没有按照我的建议在“编辑面板”上使用setOpaque(false)。该代码只会出现工作,因为您没有正确地进行自定义绘画。你应该总是在你的绘画方法开始时调用super.paintComponent(g)。这将自动绘制背景,这就是您需要使面板透明的原因。

    【讨论】:

    • 我试过你的建议,没有骰子。我编辑了代码并添加了其余部分,以便编译,以供参考。
    • I edited the code and added the rest so it compiles 是的,但由于您没有添加 main() 方法,因此无法执行。使代码完整,所以我们需要做的就是复制/粘贴/编译/执行!!!无论如何,请参阅编辑以了解真正的问题。
    • 很抱歉,这里有点新,有点赶时间,感谢您的帮助。
    猜你喜欢
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    相关资源
    最近更新 更多